比方说,我有一个流(观察到的),还有一些元素:如何等待一个承诺,以解决和跳过RxJS中间元素呢?
--a---b-c---d--
如果我有一个函数,这些元素之一,并返回一个承诺,就像一个请求,我做的是一个flatMap
功能,将得到的反应流将是这样的(大写字母是响应):
--a---b-c---d--
----A----B---CD
但是,这意味着,对于c
请求将用于b
端请求之前启动。假设我想避免c
的请求进行,并有这样的结果:
--a---b-c---d--
----A----B----D
我应该如何解决这个问题?
在下面的代码中,我有一个流在1,2,4和7秒后发射。我有一个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)
产生的副作用。
没错,如果你使用的是RxJS 5,'flatMapFirst'已经[重命名](https://github.com/ReactiveX/rxjs/blob/master/MIGRATION.md#operators-renamed-or-removed)到['exhaustMap' ](http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-exhaustMap)。 – cartant
对不起,虽然这是非常有用的,但我忘了提及我想避免函数被完全调用。那可能吗?我会更新这个问题来包含这个问题。 –
避免函数被完全调用是什么意思?您需要发布一些代码,但原则上,因为您的observable未订阅,所以不会执行任何操作。虽然在某些情况下可以执行请求,但只有响应放在可观察对象中,在这种情况下,您可以在订阅时使用'defer'来推迟请求的执行。如果您发布了一些代码,我可以更清楚地解释这个 – user3743222