我想从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


这是正确的工作!

我不知道为什么,该如何解决?

最佳答案

整个问题是Promises是异步解决的,但是当您多次调用click$.next(testPromise)时,这都是严格同步的,因此,当mergeScan的投影函数被调用acc时,它仍然是0(因为尚未解决任何诺言) 。

通过执行next()异步调用,您可以看到它可以按预期工作:

setTimeout(() => click$.next(testPromise));

关于javascript - RxJs mergeScan运算符不能通过Promise中的流flatMap进行累积吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55721753/

10-10 05:45