我想从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
这是正确的工作!
我不知道为什么,怎么解决?
答案 0 :(得分:1)
整个问题是承诺是异步解决的,但是当您多次调用click$.next(testPromise)
时,这都是严格同步的,因此,当mergeScan
的投影函数被调用时,acc
仍然是{{ 1}}(因为尚未兑现承诺)。
通过进行0
异步调用,您可以看到它可以按预期工作:
next()