RxJs mergeScan运算符不能通过Promise中的流flatMap进行累积吗?

时间:2019-04-17 07:05:16

标签: javascript rxjs

我想从flatMap诺言中累积流,我发现一个名称为“ mergeScan”的操作者可以对其中的流进行扁平化并对其进行累积。 但是,当我尝试使用它时,我发现它在流中出现诺言时不起作用,但是在没有诺言的情况下可以正常工作。

    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

但是当我在下面编写代码时:

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

这是正确的工作!

我不知道为什么,怎么解决?

1 个答案:

答案 0 :(得分:1)

整个问题是承诺是异步解决的,但是当您多次调用click$.next(testPromise)时,这都是严格同步的,因此,当mergeScan的投影函数被调用时,acc仍然是{{ 1}}(因为尚未兑现承诺)。

通过进行0异步调用,您可以看到它可以按预期工作:

next()