账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    在 Rxjs 中,为什么 mergeScan 操作符累加会失效?
    68
    0

    我想用 promise 中返回的数据进行累加,于是应用了 rxjs 中的 mergeScan 操作符。但是在应用中发现,如果在返回的流中包含了 flatMap 过的 promise,则返回的值不会累加到累加器上面去:

    const Rx = require('rxjs/Rx');
    const {
      of ,
    } = require('rxjs');
    
    const click$ = new Rx.Subject();
    const seed = 0;
    const testPromise = new Promise((resolve) => {
      resolve(1);
    })
    const count$ = click$.mergeScan((acc, promise) => of (promise)
      .flatMap(promise => promise)
      .map((one) => {
        console.log('acc', acc);
        return acc + one
      }), seed);
    count$.subscribe(x => console.log('value',x)); 
    
    click$.next(testPromise);
    click$.next(testPromise);
    click$.next(testPromise);

    输出如下,累加器的值没有增加:

    acc, 0
    value, 1
    acc, 0
    value, 1
    acc, 0
    value, 1
    

    但是如果去除掉 promise:

    const Rx = require('rxjs/Rx');
    const {
      of ,
    } = require('rxjs');
    
    const click$ = new Rx.Subject();
    const seed = 0;
    const count$ = click$.mergeScan((acc, one) => of (one)
      .map((one) => {
        console.log('acc', acc);
        return acc + one
      }), seed);
    count$.subscribe(x => console.log('value', x));
    
    click$.next(1);
    click$.next(1);
    click$.next(1);
    

    输出是:

    acc, 0
    value, 1
    acc, 1
    value, 2
    acc, 2
    value, 3
    

    可以正常的工作。
    请问这是什么原因呢?我该如何修复这个问题?

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 共 0 条
    • 樱の花が舞う 普通会员 1楼

      在 Rxjs 中,mergeScan 是一个操作符,它用于将多个 Observable 串联起来,然后在 merge 运算符完成时对结果进行累积。然而,mergeScan 会忽略最后一个 Observable 的结果,因为它是一个单调的观察者。

      如果你想在 mergeScan 中处理最后一个 Observable 的结果,你需要使用吸收器( accumulation operator)。吸收器是一个特殊的 Observable,它在观察者完成其所有操作后停止。吸收器允许你以不同的方式累积结果。

      例如,以下代码中,我们创建了一个吸收器,然后使用 mergeScan 操作符来累积所有 Observable 的结果:

      ```javascript import { mergeScan } from 'rxjs/operators';

      const source$ = new Observable(x => x * x); const accumulator$ = mergeScan(source$, x => x + x);

      console.log(accumulator$.subscribe(value => console.log(value))); ```

      在这个例子中,mergeScan 操作符接收两个 Observable,然后在它们完成时将它们合并。最后,我们使用吸收器 accumulator$ 来累积所有 Observable 的结果。当观察者完成其所有操作时,accumulator$ 会停止,这意味着我们可以以不同的方式累积结果。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部