在我的一个角度项目中,我使用rxjs计时器实现了一个http轮询器。 每当http响应延迟超过轮询间隔时,挂起的请求就会被取消。
使用的逻辑在https://rxviz.com/v/VOKjA9Mo处演示。这里预期的结果是1到5.但似乎有时mockApiCall observable被随机取消(当响应时间为800毫秒时)。
let n = 0
function mockApiCall(){
// delays 400 or 800 millis randomly
n++
return Rx.Observable.of([n])
.delay(400 + Math.round(Math.random()) * 400)
}
Rx.Observable
.timer(500, 500)
.switchMap( _=>mockApiCall()).take(5)
如何避免取消此计时器中使用的内部可观察量。即计时器应该等到api呼叫结束。
答案 0 :(得分:1)
看起来您正在寻找exhaustMap
而不是switchMap
(我对您的描述感到有点困惑):
将每个源值投影到Observable,该Observable仅在先前投影的Observable已完成时才合并到输出Observable中。