我可以在 NgRx 效果中使用的 RxJs switchMap 中使用 async/await

Can I use async/await inside an RxJs switchMap being used in an NgRx effect

我正在 Angular 支持 NgRx 的应用程序中设置新的 Effect 模块。

当我打开一个视图时,我想提出很多请求。由于有许多请求,我想将它们放入它们自己的方法中并让它们分派 successfailed 操作。这些请求的 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 () => {...})()