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

为什么HTTP请求会取消/中断Observable流,仅返回最后一条处理结果?

问题根因

你出现这个问题的核心是误用了switchMap操作符:

  • switchMap的核心特性是当上游发射新值时,会直接取消上一个还未完成的内部Observable订阅
    你代码里第一个switchMap用from(applications)把应用数组拆成逐个发射的流,每个应用都会触发第二个switchMap的HTTP请求。因为HTTP请求是异步的,前面的请求还没返回结果,下一个应用就已经发射到第二个switchMap,导致前面的请求直接被取消,只有最后一个请求能完整执行完成。
  • 你换成of([])后功能正常,是因为of是同步发射值的,上一个内部Observable在新的应用值到来之前就已经执行完毕,不会被switchMap取消,所以所有元素都能正常输出。

修复方案

把第二个switchMap替换为符合你需求的映射操作符即可:

  1. 如果需要保持应用的原始顺序,按顺序逐个发起请求,用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()
)
  1. 如果不需要保持顺序,希望并发发起所有请求提升效率,用mergeMap(可以传第二个参数限制最大并发数,避免请求过多被服务端限流):
// 示例限制同时最多发3个请求
mergeMap((application) => {
  return forkJoin([of(application), this.blobsService.getBlobBs({visitId, applicationId: application.id})])
}, 3)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:15:00