共被编辑 2 次

版本 更新时间 贡献者 编辑原因 操作
#r2 4月17日 demongodYY46 更新问题 查看

在 Rxjs 中,为什么 mergeScan 操作符累加会失效?

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

可以正常的工作。
请问这是什么原因呢?我该如何修复这个问题?

#r1 4月17日 demongodYY46 创建问题 查看

在 Rxjs 中,为什么 mergeScan 操作符累加会失效?

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

可以正常的工作。
请问这是什么原因呢?我该如何修复这个问题?