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
相关产品推荐
相关产品推荐

