[英]Angular2 RxJS reply corrent http requests periodically (polling)
我使用Angular2 2.4.8。 我使用Http
服务获取数据:
fetchData(urls: string[], computer: Computer): Observable<Computer> {
let stream$ = <Subject<Computer>>new Subject();
let requests = new Map<string, Observable<Response>>();
urls.forEach(url => {
requests.set(url, this.http.get(url));
});
Observable.forkJoin(Array.from(requests, x => x[1]))
.subscribe((responses: Response[]) => {
// put data from responses into computer (API gives data in pieces)
stream$.next(computer);
stream$.complete();
},
(e: Response) => {
// do something with error
stream$.error(e.json());
});
return stream$.asObservable();
}
现在,我需要定期刷新数据(轮询)。 困难在于不同URL的频率应该不同。 我可以使用Rx实现吗?
也许代替参数urls: string[]
我可以传递具有url和新频率的对象数组。 但是我不知道如何在Rx中解决这个问题。
如果要定期发出HTTP请求,则需要使用.interval
。 这将使您可以不时地“触发”新请求。
例如:
function poll (tuple) { return Rx.Observable.combineLatest( tuple.map(({url, time}) => { return Rx.Observable .interval(time) .switchMap(val => Rx.Observable.of(`${url}: ${val}`)); }) ); } poll([ { url: 'foo', time: 500 }, { url: 'bar', time: 100 } ]).subscribe(val => console.log(val));
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>
用您的http
服务替换Rx.Observable.of
部分。
这实际上取决于您到底要做什么以及如何处理从fetchData()
返回的Observable。
通常,如果您想定期重复一个请求,可以使用repeatWhen()
运算符并将其与delay()
:
urls.forEach(url => {
requests.set(url, this.http.get(url)
.repeatWhen(notifier => notifier.delay(XXX)));
});
另外,如果要重复请求,则不能使用forkJoin()
因为它只会发出值并立即完成。
在这种情况下, combineLatest()
或zip()
看起来都不错,具体取决于您要实现的目标。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.