2017-08-23 19 views
7

當我試圖讓通過在角4 HTTP服務多個HTTP請求, 以前的請求獲得在Chrome取消(但他們到達服務器)。 例子:角4.一系列的HTTP請求被取消

const obs1 = this.http.get(`${API_URL}/transitions`); 
const obs2 = this.http.get(`${API_URL}/states`); 
obs1.subscribe(); 
obs2.subscribe(); // this will cancel obs1's http request 

但是如果我更換.subscribe().publish().connect()像上面,它會正常工作(不是抵消)

const obs1 = this.http.get(`${API_URL}/transitions`); 
const obs2 = this.http.get(`${API_URL}/states`); 
obs1.publish().connect(); 
obs2.publish().connect(); 

或者,如果我合併兩個Observables爲一,然後獲得認購像上面,它也能正常工作

const obs1 = this.http.get(`${API_URL}/transitions`); 
const obs2 = this.http.get(`${API_URL}/states`); 
Observable.merge(obs1, obs2).subscribe() 

爲什麼我要面對這種行爲?我需要了解,而不是繞過。我怎樣才能讓一系列請求沒有合併,分叉等?

回答

6

我發現此行爲的潛在原因。

感謝https://github.com/ghetolayhttps://github.com/dklmuc

我們發現,角將取消非常快的HTTP請求,其中沒有任何回調。所以,你必須通過onNext在訂閱

https://github.com/ghetolay:如果連接

確定它的競爭狀態,我認爲

它總是會調用xhr.abort()上拆卸

仍然被認爲是由瀏覽器將關閉它打開,否則可能什麼都不做

所以當你有響應的速度非常快的處理(如無回調是真的真的快)可以中止那些仍被視爲開放連接

這一個正常工作:

for (let i = 1; i < 50; i++) { 
    http.get(`https://swapi.co/api/people/${i}`).subscribe((result) => { 
     console.log(i, result); 
    }); 
} 
+0

現在我感覺不好,因爲我會有關發表評論,但只是假定你的例子進行了簡化。如果你需要執行一個沒有訂閱的http請求。你可以調用'http.get(...)。take(1)'在獲取第一個項目後訂閱並銷燬訂閱。 – cgTag

+0

@ctTag是否需要(1)將調用請求事件而不訂閱方法? – WimmDeveloper

+0

@ctTag不,它不會。現在檢查。但是我剛剛意識到,對於HTTP方法非常合乎邏輯的使用'。取(1)' – WimmDeveloper

0

這與觀測做被取消,儘管我必須承認,我不知道你面臨的問題的根本原因。

我碰到一個類似的問題使用NGRX /效果模塊。操作處理程序使用ngrx切換映射操作符向服務發出請求。除最後一個請求外的所有內容都將被取消將其更改爲合併圖解決了該問題。 以下是密碼

@Effect() 
    loadSomeData$: Observable<Action> = this.actions$ 
      .ofType(SomeActions.Load_Data) 
      .mergeMap((id) => 
        this.someService.getSomething(id) 
          .map((someEntity) => new SomeActions.LoadDataSuccess(someEntity) 
          ).catch((x, y) => { 
            console.error('Error occured'); 
            return Observable.of(new SomeActions.LoadDataFailed(id)); 
          } 
          )); 

此處重現ngrx的相關部分。

https://www.learnrxjs.io/operators/transformation/switchmap.html

switchMap等平坦化操作符之間的主要區別是抵消效果。在每次排放中,先前的內部可觀察值(您提供的函數的結果)被取消,並且新的可觀察值被訂閱。你可以通過切換到新的可觀察值來記住這一點。