我可以在 NgRx 效果中使用的 RxJs switchMap 中使用 async/await
Can I use async/await inside an RxJs switchMap being used in an NgRx effect
我正在 Angular 支持 NgRx 的应用程序中设置新的 Effect 模块。
当我打开一个视图时,我想提出很多请求。由于有许多请求,我想将它们放入它们自己的方法中并让它们分派 success
或 failed
操作。这些请求的 API 都是 async
方法(它们 return 一个承诺)
我有以下
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
代码没有被调用是有原因的吗?我在上面尝试做的事情是否可行?
为什么不使用 promises,让您的请求可观察?您可以从 switchMap
returnforkJoin
如下:
switchMap(_ => {
// p1 and p2 are Observables
const p1 = …;
const p2 = …;
return forkJoin([p1, p2]);
})
此时您要用括号括起异步调用,您必须使其成为立即调用的异步函数表达式。基本上,在将异步函数表达式包装在括号中之后,您缺少一些执行异步函数的括号。我认为它应该类似于:
(async () => {...})()
我正在 Angular 支持 NgRx 的应用程序中设置新的 Effect 模块。
当我打开一个视图时,我想提出很多请求。由于有许多请求,我想将它们放入它们自己的方法中并让它们分派 success
或 failed
操作。这些请求的 API 都是 async
方法(它们 return 一个承诺)
我有以下
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
代码没有被调用是有原因的吗?我在上面尝试做的事情是否可行?
为什么不使用 promises,让您的请求可观察?您可以从 switchMap
returnforkJoin
如下:
switchMap(_ => {
// p1 and p2 are Observables
const p1 = …;
const p2 = …;
return forkJoin([p1, p2]);
})
此时您要用括号括起异步调用,您必须使其成为立即调用的异步函数表达式。基本上,在将异步函数表达式包装在括号中之后,您缺少一些执行异步函数的括号。我认为它应该类似于:
(async () => {...})()