2016-04-21 75 views
1

我想要調用一個API來正確處理請求並對API請求執行標準錯誤處理。例如,我有一個ApiErrorsService,我想在任何API調用發生錯誤時調用它。我還希望以標準方式提交調用,即將Content-Type設置爲application/json並序列化請求對象。爲Angular 2 Http訂閱兩次?

當然,當我訂閱從Http返回的observable時,它會被調用一次,當我返回並且調用者訂閱它時,它會再次被調用。能夠在兩次執行API調用的情況下偵聽結果的最佳方式是什麼?我可以撥打.publish().share()並返回那個嗎?我需要處理嗎?是否有可能發生的時間問題?如果我嘲笑API調用並立即返回一個值,那麼這個工作是否正常,或者調用者的訂閱是否會錯過這些值?下面的代碼我有:

post(path: string, data: any): Observable<Response> { 
    var headers: Headers = new Headers(); 
    headers.set("Content-Type", "application/json"); 
    var s = data == null ? null : JSON.stringify(data, null, 2); 
    var shared = this.http.post(path, s, { headers: headers }).share(); 
    shared.subscribe(null, err => this.appErrorsService.addApiError(err)); 
    return shared; 
} 

回答

2

使用share是矯枉過正。如果您只想處理內聯錯誤,則可以使用do代替:

return this.http.post(path, s, { headers: headers }) 
    .do(null, err => this.appErrorsService.addApiError(err)); 
2

使用share就夠了,HTTP可觀察自動完成,所以你不必退訂。除非你要在異步方法(setTimeout/etc)中訂閱第二個監聽器,否則沒有辦法錯過值。