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