假设我有一个流(可观察对象),其中包含一些元素:
--a---b-c---d--
如果我有一个函数,它接受其中的一个元素并返回一个Promise,比如一个请求,然后我使用flatMap
和这个函数,那么结果响应流将会是这样的(大写字母表示响应):
--a---b-c---d--
----A----B---CD
但这意味着对于 c 的请求将在 b 的请求结束之前开始。假设我想要避免执行对 c 的请求,并得到以下结果:
--a---b-c---d--
----A----B----D
我应该如何解决这个问题?
在以下代码中,我有一个流,在1、2、4和7秒后发出。我有一个需要2秒才能完成的request
函数。我希望该函数仅在1、4和7时调用(不是在2时,因为1的请求还没有完成)。
const Rx = require('rx');
const logNext = x => console.log(new Date(), 'Next:', x);
const logError = x => console.log(new Date(), 'Error:', x);
const logCompleted = () => console.log(new Date(), 'Completed.');
Rx.Observable.fromArray([1, 2, 4, 7])
.flatMap(x => Rx.Observable.of(x).delay(x * 1000))
.flatMapFirst(request)
.subscribe(logNext, logError, logCompleted);
function request(x) {
console.log(`Starting request with ${x}`);
return new Promise(resolve => {
setTimeout(
() => {
console.log(`Finishing request with ${x}`);
resolve(x)
},
2000
);
})
}
flatMapFirst
可以生成正确的响应流,但我希望避免调用request(2)
产生的副作用。
flatMapFirst
已经被重命名,改为exhaustMap
。 - cartantdefer
来延迟请求在订阅时执行。如果您发布一些代码,我可以更清楚地解释这一点。 - user3743222