我正在啟用 Angular NgRx 的應用程式中設定一個新的效果模塊。
當我打開一個視圖時,我想提出很多請求。由于有許多請求,我想將它們放入自己的方法中,并讓它們分派successorfailed動作。這些請求的 API 都是async方法(它們回傳一個承諾)
我有以下
public viewOpened$ = createEffect(() => this.actions$.pipe(
ofType(myActions.viewOpened),
// Use a switchMap to cancel any ongoing subscriptions if request new comes in
switchMap(_ => {
(async () => {
this.logger.info('view Opened');
const p1 = this.request1();
const p2 = this.request2();
// await so switchMap can handle any race conditions
await Promise.all([p1, p2]);
});
// Need to return an observable (but this is not used)
return of({})
})
), { dispatch: false });
我正在使用一個switchMap希望這將為我處理任何“競爭條件”,即如果視圖快速打開、關閉然后再次打開,switchMap 將取消任何以前未完成的請求。
但是我在上面發現的是,里面的代碼async永遠不會被呼叫。
我的代碼沒有被呼叫是否有原因async,并且我在上面嘗試做的事情是否可行?
uj5u.com熱心網友回復:
您在此時用括號將異步呼叫包裝起來,您必須使其成為立即呼叫的異步函式運算式。基本上,在將異步函式運算式包裝在括號中之后,您缺少一些執行異步函式的括號。我認為它應該類似于:
(async () => {...})()
uj5u.com熱心網友回復:
為什么不使用承諾,而不是讓您的請求可觀察?您可以forkJoin從switchMap以下回傳:
switchMap(_ => {
// p1 and p2 are Observables
const p1 = …;
const p2 = …;
return forkJoin([p1, p2]);
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/413240.html
標籤:
上一篇:條件怎么能降到一行?
