我目前有一个Observable计时器:
private poller(): Observable<PrepareData> {
return Observable.timer(0, 5000).switchMap(() => this.http.get("/cgi/dashboard.php")).map(res => res.json());
}
Run Code Online (Sandbox Code Playgroud)
我想拥有它,所以在最后一个完成后5秒完成获取请求.有什么简单的方法吗?
n00*_*dl3 11
我会在@ Maxime的答案中添加我的答案,但实际上不需要一个主题.
这是使用.concat()运算符和getData()函数递归完成的.
.concat()通过顺序发出它们的值来连接多个Observable,一个Observable接着另一个.
(......)
concat将订阅第一个输入Observable并发出其所有值,而不以任何方式更改或影响它们.当Observable完成时,它将订阅然后传递下一个Observable,并再次发出其值.这将重复,直到操作员用尽Observables.当最后一个输入Observable完成时,concat也将完成.
(我使用js版本来制作一个与Stack Overflow工具一起使用的片段,但这对于typescript来说是相同的):
function someHTTPCall() {
// well it's a fake http call
console.log("making the Http request (can take up to 5s)...");
return Rx.Observable.of("http response !")
.delay(Math.round(Math.random() * 5000));
}
function getData() {
return someHTTPCall()
.concat(Rx.Observable.timer(5000).switchMap(() => getData()));
}
let myObs = getData();
myObs.subscribe((data) => {
console.log(data,"waiting for 5 seconds before next request");
});Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/rxjs@5.4.0/bundles/Rx.min.js"></script>Run Code Online (Sandbox Code Playgroud)
这是一个有趣的问题,我有一些乐趣来提出解决方案.
此解决方案等待前一个按预期完成:
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()
Run Code Online (Sandbox Code Playgroud)
请注意,我已经在请求上放了3秒延迟,并且每8秒发出一个新请求,因为我们等待响应3秒,然后在问题中请求5秒.
这是一个有效的Plunkr:https://plnkr.co/edit/kXefUbPleqyyUOlfwGuO ? p = info
| 归档时间: |
|
| 查看次数: |
2639 次 |
| 最近记录: |