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

如何统计JavaScript中map()调用内抛出的异常次数?

解决API调用错误计数的问题

你的代码里errorCount始终为0的原因有两个:

  1. map阶段没有触发API调用:Observable.fromPromise只是创建了Observable对象,真正的API请求要等到Observable被订阅后才会执行,所以map过程中根本没跑SendRequest,自然不会抛出错误。
  2. 异步错误无法被同步try/catch捕获:就算SendRequest立刻执行了,它返回的是Promise,属于异步操作,外层的同步try/catch抓不到异步抛出的异常。

基础实现方案

要统计每个API调用的失败次数,需要在每个请求的Observable里单独处理错误,同时保证整个流不中断,最后统一统计。用RxJS的catchError和forkJoin实现:

let errorCount = 0;
// 给每个请求的Observable添加错误捕获逻辑
const requestObservables = targets.map(element => 
  Observable.fromPromise(SendRequest(ApiController.API_NAME, {
    urlParams: { id: element.id }
  })).pipe(
    catchError(err => {
      // 每次捕获到错误就递增计数
      errorCount += 1;
      // 返回空流,让整体的forkJoin不会因为单个错误中断
      return Observable.empty();
    })
  )
);

// 订阅所有请求,完成后即可获取最终错误次数
forkJoin(requestObservables).subscribe({
  complete: () => {
    // 这里可以根据errorCount的值渲染对应组件
    console.log('API调用失败次数:', errorCount);
  }
});

同时收集成功结果的方案

如果需要同时保留成功的请求结果,可以调整catchError的返回值:

let errorCount = 0;
const requestObservables = targets.map(element => 
  Observable.fromPromise(SendRequest(ApiController.API_NAME, {
    urlParams: { id: element.id }
  })).pipe(
    catchError(err => {
      errorCount += 1;
      // 返回null作为失败标识,后续可以过滤出成功结果
      return Observable.of(null);
    })
  )
);

forkJoin(requestObservables).subscribe({
  next: (allResults) => {
    const successResults = allResults.filter(result => result !== null);
    console.log('成功的请求结果:', successResults);
    console.log('失败次数:', errorCount);
    // 在这里根据errorCount渲染不同组件
  }
});

关键说明

  • catchError会捕获单个Observable的错误,处理后返回新的Observable,保证整个流继续执行,不会因为某个请求失败导致所有请求中断。
  • forkJoin会等待所有Observable完成(不管成功还是被catchError处理),适合批量处理多个请求并统一获取结果的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:50:37