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来修复此问题