我想用 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
可以正常的工作。
请问这是什么原因呢?我该如何修复这个问题?
你是同步调用了三次
next
,导致并没有产生累加的过程。可以添加
observeOn(asyncScheduler)
,强制成异步。