[英]How to start immediately an Angular 2 Observable when using interval
[英]Angular 8: How to send the http request immediately using interval of Observable
我具有將請求從前端連續發送到后端的功能。 所以我添加了下面給出的代碼。
我想以第一個請求應該立即執行 go 的方式實現,然后在兩分鍾后執行。
但是使用下面的代碼並根據間隔的定義,它將在兩分鍾后發送第一個請求。
this.getData = Observable.interval(2 * 60 * 1000)
.pipe(flatMap(() => this.service.getData(b, b, b, b, b, b))).subscribe();
我不想通過首先添加請求然后添加上面的代碼來重復代碼,任何其他方式來完成它。
解決它的最簡單的方法是使用timer
運算符而不是interval
運算符,初始延遲為 0 秒。
this.getData = Observable.timer(0, 2 * 60 * 1000)
.pipe(flatMap(() => this.service.getData(b, b, b, b, b, b))).subscribe();
repeat
和delayWhen
運算符上述解決方案對於簡單的用例很有用。 但是,如果您需要動態控制每個請求之間的延遲並根據某些條件完成輪詢,則可以使用repeat
、 delayWhen
和takeWhile
運算符。
let condition = 0;
this.service.getData(b, b, b, b, b, b).pipe(
take(1),
delayWhen(_ => condition === 0 ? timer(0) : timer(2 * 60 * 1000)), // set poll delay
repeat(),
takeWhile(_ => condition < 5), // stop polling when `condition` is 5
switchMap(response => {
// do something and update the `condition`
condition++;
return of(response);
})
).subscribe(
res => console.log(res),
err => console.log(err),
() => console.log('complete')
);
您還可以使用repeatWhen
運算符對何時重復請求進行更精細的控制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.