You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合RxJs与NgRx实现多REST请求并等待返回结果?

解决NgRx Effect中等待所有REST请求完成后触发Action的问题

你的问题出在异步操作的时序处理上:用forEach遍历发起请求时,这些HTTP请求是异步执行的,但你立刻就返回了of(someOtherAction(array)),这时候请求还没返回结果,数组自然是空的。

要实现等待所有请求完成再触发后续Action,你可以用RxJS的forkJoin操作符——它会等待传入的所有Observable都完成后,把所有结果按顺序打包成数组返回。

正确实现代码

someEffect$ = createEffect(() => 
    this.action$.pipe(
        ofType(someAction),
        mergeMap(({ someValue }) => {
            // 把数组每个值转换成对应的HTTP请求Observable
            const requestObservables = someValue.map(value => 
                this.httpCall.getSomeTh(value)
            );

            // 用forkJoin等待所有请求完成,拿到结果数组
            return forkJoin(requestObservables).pipe(
                map(results => someOtherAction(results)), // 把结果数组传给目标Action
                catchError(error => {
                    // 可选:处理请求出错的情况,比如触发错误Action
                    return of(someErrorAction(error));
                })
            );
        })       
    )
);

关键说明

  • map替代forEach:把字符串数组转换成HTTP请求的Observable数组,而不是直接发起请求
  • forkJoin:专门用于等待多个异步操作全部完成的场景,只有当所有传入的Observable都发出完成信号时,才会输出结果数组
  • 错误处理:建议加上catchError,避免单个请求失败导致整个Effect报错中断

内容的提问来源于stack exchange,提问作者DaumannM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 14:25:14