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

Redux+redux-angular场景下如何避免多请求action被自动取消

问题原因

你遇到的请求被取消问题和Redux本身无关,是RxJS操作符switchMap的默认特性导致的:
switchMap的核心逻辑是,只要上游流传递了新的事件,就会立即取消上一个还未执行完成的内部Observable订阅。你连续触发了三次拉取进度的action,前两次的请求还没返回就被第三次触发的action给取消了,所以只有最后一个请求能成功返回。
你之前给每个action设置不同type的操作不生效,是因为你的epic逻辑里是用startsWith匹配所有前缀符合的action,所有拉取进度的action都会流入同一个switchMap处理流,还是会触发取消逻辑。

解决方案

只需要把epic代码中的switchMap替换为mergeMap即可:

private createUserCourseProgressEpic() {
  return action$ => action$
    .pipe(
      filter((data: any) => {
        console.log('filter', data.type);
        return data.type.startsWith(TYPES.FETCH_USER_COURSE_PROGRESS);
      }),
      // 把switchMap替换为mergeMap
      mergeMap(({ payload }) => this.getUserProgressForCourseUrl(payload.url)
        .pipe(
          map(progress => this.actions.fetchCourseProgressSuccess( progress, payload.url)),
          catchError(error => {
            console.log('errorrr');
            this.logError(error);
            return of(this.actions.fetchCourseProgressFail(error));
          }),
        )
      )
    );
}

mergeMap会同时维护所有内部Observable的订阅,不会主动取消之前的请求,所有课程的进度拉取请求都会并行执行直到完成。

如果你的场景需要保证请求按触发顺序依次执行,也可以把switchMap替换为concatMap,它会等上一个请求完成后再执行下一个请求,同样不会取消未完成的任务。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:18:02