RxJS使用forkJoin时后续observable依赖前序返回值如何实现?
你需要的是串行执行依赖前序结果的Observable流,直接使用concatMap操作符链式调用即可,最终只会返回最后一步sourceThree的执行结果,错误处理逻辑和你给出的forkJoin示例完全一致:
import { of, throwError } from 'rxjs'; import { delay, concatMap, catchError } from 'rxjs/operators'; const example = of('Hello').pipe( // 第一步:获取sourceOne结果,构造sourceTwo请求 concatMap(sourceOneRes => { // 此处可使用sourceOne返回的参数构造sourceTwo的请求逻辑 console.log('sourceOne返回值:', sourceOneRes); // 示例用of模拟你的真实sourceTwo请求 return of('World').pipe(delay(1000)); }), // 第二步:获取sourceTwo结果,构造sourceThree请求 concatMap(sourceTwoRes => { // 此处可使用sourceTwo返回的参数构造sourceThree的请求逻辑 console.log('sourceTwo返回值:', sourceTwoRes); // 示例用throwError模拟请求出错,正常场景替换为你的真实请求即可 return throwError('This will error'); }), // 全局错误捕获,任意环节出错直接返回错误 catchError(error => of(error)) ); // 订阅拿到的就是sourceThree的返回值或错误信息 const subscribe = example.subscribe(val => console.log(val));
说明
- 流是严格按顺序执行的,只有前一个请求完成才会触发下一个,完全满足后序请求依赖前序返回值的要求
- 不需要合并中间结果的话,不用额外存储中间值,最终订阅拿到的就是最后一步
sourceThree的返回结果 - 如果你的场景存在同一时间可能触发多次该请求流的情况,可以把
concatMap替换为switchMap,自动取消前一次未完成的请求链,避免旧请求结果覆盖新请求的问题
内容的提问来源于stack exchange,提问作者Dani
相关产品推荐
相关产品推荐

