我目前有一个可观察的计时器:
private poller(): Observable<PrepareData> {
return Observable.timer(0, 5000).switchMap(() => this.http.get("/cgi/dashboard.php")).map(res => res.json());
}
我想拥有它,因此在完成最后一个请求后5秒钟完成了一个get请求。有任何简单的方法吗?
最佳答案
这是一个有趣的问题,我很高兴提出了一个解决方案。
此解决方案等待您期望的解决方案完成:
const { Observable, Subject } = Rx
const getFakeHttpRequest$ = () => Observable.of('response !').delay(3000)
const polling$ = new Subject()
Observable
// need to tick the first time
.of(null)
// everytime our polling$ subject will emit, we'll do again what's next
.merge(polling$)
// register to a fake request
.switchMap(_ =>
getFakeHttpRequest$()
.do(_ => {
// once we're here, the request is done
// no mater how long it was to get a response ...
console.log('HTTP request done !');
// ... we wait 5s and then send a new value to polling$ subject
// in order to trigger a new request
setTimeout(_ => polling$.next(null), 5000)
})
)
.subscribe()
请注意,我在请求上设置了3s的延迟,并且每隔8s就会启动一个新请求,因为我们等待3s响应,然后按照您的问题的要求等待5s。
这是一个工作的Plunkr:https://plnkr.co/edit/kXefUbPleqyyUOlfwGuO?p=info
关于angular - 可观察的轮询?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42657380/