为什么HTTP请求会取消/中断Observable流,仅返回最后一条处理结果?
问题根因
你出现这个问题的核心是误用了switchMap操作符:
switchMap的核心特性是当上游发射新值时,会直接取消上一个还未完成的内部Observable订阅
你代码里第一个switchMap用from(applications)把应用数组拆成逐个发射的流,每个应用都会触发第二个switchMap的HTTP请求。因为HTTP请求是异步的,前面的请求还没返回结果,下一个应用就已经发射到第二个switchMap,导致前面的请求直接被取消,只有最后一个请求能完整执行完成。- 你换成
of([])后功能正常,是因为of是同步发射值的,上一个内部Observable在新的应用值到来之前就已经执行完毕,不会被switchMap取消,所以所有元素都能正常输出。
修复方案
把第二个switchMap替换为符合你需求的映射操作符即可:
- 如果需要保持应用的原始顺序,按顺序逐个发起请求,用
concatMap:
this.serviceOne.getAllApplications(visitId).pipe( switchMap((applications) => from(applications)), concatMap((application) => { console.log("successfully logs every application in applications array"); return forkJoin([ of(application), this.blobsService.getBlobBs({ visitId, applicationId: application.id, }), ]); }), map(([application, blobs]) => { console.log("logs for all applications now"); return { ...application, blobs }; }), toArray() )
- 如果不需要保持顺序,希望并发发起所有请求提升效率,用
mergeMap(可以传第二个参数限制最大并发数,避免请求过多被服务端限流):
// 示例限制同时最多发3个请求 mergeMap((application) => { return forkJoin([of(application), this.blobsService.getBlobBs({visitId, applicationId: application.id})]) }, 3)
内容的提问来源于stack exchange,提问作者Vazhaabdu
相关产品推荐
相关产品推荐

