gpt4 book ai didi

javascript - RxJs mergeScan 运算符不能通过 Promise 中的流 flatMap 进行累积?

转载 作者:行者123 更新时间:2023-11-30 14:04:22 25 4
gpt4 key购买 nike

我想从 flatMap promise 中累积流,我找到一个名为“mergeScan”的运算符可以平流并累积它们。但是当我尝试它时,我发现它在流中 promise 时不起作用,但在没有 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

但是当我在下面写代码时:

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

工作正常!

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

最佳答案

整个问题是 Promise 是异步解决的,但是当你多次调用 click$.next(testPromise) 时,这一切都是严格同步的,所以当 mergeScan 的投影函数> 被称为 acc 仍然是 0(因为还没有解决任何 promise )。

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com