繁体   English   中英

Angular2 RxJS定期答复相应的http请求(轮询)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM