Rxjs 如何使轮询可见并检测未完成的承诺

Rxjs 如何使轮询可见并检测未完成的承诺,rxjs,polling,Rxjs,Polling,这个可观察的函数每秒轮询getPromise()函数。函数在getPromise()之后返回3个承诺,并停止解析它们。如何检测getPromise()函数在过去的2秒钟内没有解析/拒绝任何承诺,并调用onError处理程序。我试着让它与timeout操作符一起工作,但没有效果。有什么想法吗 Rx.可观测间隔(1000) .switchMap(()=>Rx.Observable.fromPromise(getPromise())) .认购(onValue,onError); 函数onValue(

这个可观察的函数每秒轮询
getPromise()
函数。函数在
getPromise()之后返回3个承诺,并停止解析它们。如何检测
getPromise()
函数在过去的2秒钟内没有解析/拒绝任何承诺,并调用
onError
处理程序。我试着让它与
timeout
操作符一起工作,但没有效果。有什么想法吗

Rx.可观测间隔(1000)
.switchMap(()=>Rx.Observable.fromPromise(getPromise()))
.认购(onValue,onError);
函数onValue(value){
console.log('value:',value);
}
函数onError(错误){
console.log('error:',error);
}
var getPromise=(函数(){
var计数器=3;
返回函数(){
返回新承诺(功能(解决、拒绝){
如果(计数器>0)解析(1);
计数器--;
})
}
})();
您可以使用只订阅发射的第一个可见光的操作符

您说过要在2次不活动后调用
onError
处理程序。这与使用
switchMap
相矛盾,后者在从回调返回新的可观察对象时自动取消订阅。因此,您可能希望使用。此外,当您发出错误通知时,链将取消订阅,您将永远不会收到任何其他值。这意味着您不应将超时作为
错误发出,也不应使用操作员自动重新订阅(但这实际上取决于您试图实现的目标)

这是您刚刚使用
race()
操作符更新的示例

Rx.可观测间隔(1000)
.switchMap(()=>
可观察的种族(
Rx.Observable.fromPromise(getPromise()),
Rx.可观测计时器(0,1000).mapTo(42)
)
)
.认购(onValue,onError);
函数onValue(value){
console.log('value:',value);
}
函数onError(错误){
console.log('error:',error);
}
var getPromise=(函数(){
var计数器=3;
返回函数(){
返回新承诺(功能(解决、拒绝){
如果(计数器>0)解析(1);
计数器--;
})
}
})();

嘿,这是一个很好的解决方案!在你拿到前42张之后,你会如何退订?我不需要剩下的。在2s过去并且没有发出任何值之后,这个可观察的应该是不可记录的。@Eugenepifanov看到我的更新,它使用
timeout()
抛出错误。实际上,RxJS 5.3.0中的
timeout()
操作符中似乎有一个bug。在RxJS 5.2.0中,它的工作原理与我所想的一样。最近对
timeout()
运算符进行了更改,但是我还添加了一个没有
timeout()
运算符的变体。RxJS 5已经有一个PR来修复此问题