2017-07-31 16 views
0

我有一個非常簡單的效果,它會生成一個http請求並在完成時調度一個動作。@angular @ ngrx/effects HTTP請求保持取消並重試

HTTP請求不斷被取消並重新翻拍。

enter image description here

本來我還以爲是switchMap這是導致該問題(取消觀察到的),所以我試圖用mergeMap(相同的結果)。

下面是我的效果代碼。

signIn$ = this.actions$ 
 
    .ofType(ACTIONS.AUTH.SIGN_IN) 
 
    .map(toPayload) 
 
    .map(payload => toInput(payload)) 
 
    .switchMap(input => this.http 
 
     .post<Output>(`${GLOBALS.endpoint}/auth/authenticate`, input) 
 
     .map(output => ({ type: ACTIONS.APP.PUSH_NOTIFICATION, payload: "test" })) 
 
     .catch(error => of(createAction(ACTIONS.APP.LOG_EXCEPTION, error))) 
 
);

上面的代碼編譯沒有錯誤,按預期工作,但事實上,它不斷取消和改造的http請求。

我不知道它是否重要,但我使用的是HttpClient(@ angular/common/http),而不是@ angular/http。

任何意見將不勝感激!

+0

這裏的問題最終成爲我寫的ng HTTP攔截器。我綁定到可觀察的商店以檢索它的自定義HTTP標頭的狀態。我綁定到那個導致http請求多次發送商店更新(由特效觸發)的綁定問題存在。該錯誤根本不在效果代碼中。只是爲了這篇文章的未來讀者:) – spyter

回答

0

看起來您在短時間內多次發送相同的請求。嘗試僅在令牌更改時限制請求。下面可能的工作:

signIn$ = this.actions$ 
    .ofType(ACTIONS.AUTH.SIGN_IN) 
    .distinctUntilChanged() 
    .map(payload => toInput(payload)) 
    .switchMap(input => this.http 
     .post<Output>(`${GLOBALS.endpoint}/auth/authenticate`, input) 
     .map(output => ({ type: ACTIONS.APP.PUSH_NOTIFICATION, payload: "test" })) 
     .catch(error => of(createAction(ACTIONS.APP.LOG_EXCEPTION, error))) 
); 
+0

感謝您的意見!我嘗試過,而且我仍然有同樣的問題。如果我使用.do(console.log)而不是distinctUntilChanged(),它只會觸發一次(如果有幫助的話)。似乎多次觸發的部分是.switchMap。任何.do日誌之下或之後的日誌都會重複發生。 – spyter

+0

嘗試'distinctUntilKeyChanged('email')'或類似的東西 – jcroll

1

「switchMap」 有自己的 「退訂」 機制 即取消該API請求,

使用 「flatMap」(或mergeMap),而不是應爲你工作。