我有兩個操作,a.load
和b.load
,並且在它們的後面,@effect被註冊爲執行c
的HTTP調用。但是,問題出現在頁面加載時,分配了a
和b
操作,因此請求兩次請求c
。我需要對這兩個操作做出反應的原因是因爲在此頁面上,a
或b
可以更改,如果是這樣,我需要執行請求以獲取c
的新值。由於一個效果和多個操作而導致的多個HTTP請求
有什麼辦法來處理/避免這種情況?也許我可以考慮取消效果之前的任何請求?
謝謝。
我有兩個操作,a.load
和b.load
,並且在它們的後面,@effect被註冊爲執行c
的HTTP調用。但是,問題出現在頁面加載時,分配了a
和b
操作,因此請求兩次請求c
。我需要對這兩個操作做出反應的原因是因爲在此頁面上,a
或b
可以更改,如果是這樣,我需要執行請求以獲取c
的新值。由於一個效果和多個操作而導致的多個HTTP請求
有什麼辦法來處理/避免這種情況?也許我可以考慮取消效果之前的任何請求?
謝謝。
您應該能夠使用來解決這個問題的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請求,而且我不確定實現如何管理它們的取消 - 可能是因爲它們的響應被忽略。
感謝這個建議,但是我應該注意到,我想要最後一次打電話。我可以通過取消訂閱請求來取消請求嗎? – maddockst
非常感謝。我想我需要看看rxjs運營商 – maddockst
我已經更新了答案。 – cartant