2017-04-09 130 views
4

我試圖創建一個服務,以給定的間隔(每5秒)輪詢日誌。我需要進行一次http GET調用,但在慢速連接和大型日誌上,switchMap取消了上一個未決請求。因此,在請求被取消時,我永遠不會收到日誌。Rxjs Observable Interval和Angular2 HTTP:等待響應

getLog(url:string):Observable<string> { 
    return Observable 
     .timer(0, 5000) 
     .switchMap(() => this.get(url)) 
     .retryWhen(error => error.delay(5000)) 
     .map((res:Response) => res.text()) 
     .catch(e => { 
      console.warn(e.toString()); 
      return Observable.from(""); 
     }); 
} 

this.get(url)只不過是get(url) {return this.http.get(url)}

我正在尋求保持定時器的功能,但不會觸發另一個http調用,直到前一個調用已解決,並且不取消掛起的調用。

+0

[RxJava中的flatmap和switchmap有什麼不同?](http://stackoverflow.com/questions/28175702/what-is-the-difference-between-flatmap-and-switchmap-in- rxjava) – jonrsharpe

+0

換句話說:改用'flatMap'。 – jonrsharpe

+0

@jonrsharpe'flatMap'不斷創建新的請求。我不想在掛起的請求完成之前創建新的請求。 – bomba6

回答

3

使用concatMap()而不是switchMap()

如您所說,switchMap()運算符會取消先前的請求。 flatMap()(或mergeMap())運算符只是創建另一個Observable並立即訂閱它們。

另一方面,concatMap()運算符等待,直到前一個Observable完成,然後訂閱下一個Observable。因此,即使您的計時器發出的請求完成得比您的計時器快,您仍然會以相同的順序收到所有回覆。