2017-02-08 34 views
1

我有兩個操作,a.loadb.load,並且在它們的後面,@effect被註冊爲執行c的HTTP調用。但是,問題出現在頁面加載時,分配了ab操作,因此請求兩次請求c。我需要對這兩個操作做出反應的原因是因爲在此頁面上,ab可以更改,如果是這樣,我需要執行請求以獲取c的新值。由於一個效果和多個操作而導致的多個HTTP請求

有什麼辦法來處理/避免這種情況?也許我可以考慮取消效果之前的任何請求?

謝謝。

回答

1

您應該能夠使用來解決這個問題的throttle operator - 這需要返回一個可觀察到的和,直至可觀察的發射,由源發射的任何值被節流/忽略的功能。

如果您通過throttle該效果本身,則處理緩慢請求時收到的任何操作都將被忽略。例如:

import 'rxjs/add/operator/throttle'; 

@Effect() 
someEffect = this.actions 
    .ofType(SOME_REQUEST) 
    .throttle(() => this.someEffect) 
    .switchMap((action) => someSlowRequest(action.payload) 
     .map((result) => ({ type: SOME_RESPONSE, payload: result })) 
     .catch((error) => Observable.of({ type: SOME_ERROR, payload: error })) 
    ); 

如果以這種方式與您基於HTTP的效果使用throttle,它會看到觸發如果有一個未決的HTTP請求忽略的影響的任何行動。所以,如果這是你正在尋找的行爲,它應該可以解決你的問題。

關於你的評論,如果你想在最後的密集行動要處理,你可以考慮使用auditTime operator - 這將等待指定的時間,然後會發出最近接收值:

import 'rxjs/add/operator/auditTime'; 

@Effect() 
someEffect = this.actions 
    .ofType(SOME_REQUEST) 
    .auditTime(100) 
    .switchMap((action) => someSlowRequest(action.payload) 
     .map((result) => ({ type: SOME_RESPONSE, payload: result })) 
     .catch((error) => Observable.of({ type: SOME_ERROR, payload: error })) 
    ); 

或者,您可以僅依靠switchMap運算符 - 在接收到新值時取消訂閱。但是,我的理解是,ngrx操作是同步分派的,因此可能會爲每個操作發出HTTP請求,而且我不確定實現如何管理它們的取消 - 可能是因爲它們的響應被忽略。

+0

感謝這個建議,但是我應該注意到,我想要最後一次打電話。我可以通過取消訂閱請求來取消請求嗎? – maddockst

+0

非常感謝。我想我需要看看rxjs運營商 – maddockst

+1

我已經更新了答案。 – cartant