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

Promise.all执行fetch抛错后如何继续执行并校验空JSON响应

实现方法

你可以通过给每个请求单独封装完整处理逻辑的方式,同时满足「同阶段完成状态+空数组校验」「单请求错误不中断整体流程」的需求,核心调整点如下:

  • 不要直接把原生fetch请求存入Promise数组,给每个fetch提前绑定完整的处理链:在单个请求的逻辑里依次完成状态码校验、JSON解析、空数组判断,所有异常场景都返回标记了失败状态的结果,不直接抛出未捕获的错误
  • 等所有请求(无论成功失败)都执行完成后,再统一过滤掉无效的失败结果、空数组结果,提取有效匹配项
  • 不需要拆分两层.then做校验,所有校验逻辑都可以在单个请求的响应处理阶段同步完成

修改后的可运行代码:

const keyword = 'AtomParser';
const refs = ['function', 'hook', 'class', 'method'];
const promises = [];

for (const type of refs) {
  const url = `https://developer.wordpress.org/wp-json/wp/v2/wp-parser-${type}?search=${keyword}`;
  // 每个请求单独封装完整处理逻辑,不对外抛出阻断性错误
  const requestTask = fetch(url)
    .then(async response => {
      // 第一步:校验状态码
      if (response.status > 299) {
        return { success: false, reason: `状态码异常:${response.status}`, type };
      }
      // 第二步:同阶段解析JSON,不需要拆分到外层链式调用
      const data = await response.json();
      // 第三步:校验空数组
      if (!Array.isArray(data) || data.length === 0) {
        return { success: false, reason: '返回结果为空数组', type };
      }
      // 校验通过返回有效数据
      return { success: true, data: data[0], type };
    })
    .catch(err => {
      // 捕获网络错误等异常,标记为失败但不中断整体流程
      return { success: false, reason: `请求异常:${err.message}`, type };
    });
  promises.push(requestTask);
}

// 等待所有请求执行完成,不会因为单个请求失败中断
Promise.all(promises).then(results => {
  // 过滤出所有匹配成功的有效结果
  const validResults = results.filter(item => item.success);
  if (validResults.length === 0) {
    console.log('未找到对应关键词的开发者文档资源');
    return;
  }
  // 取第一个匹配到的结果即可
  const { data: reference, type } = validResults[0];
  console.log(`匹配到资源类型:${type}`, reference);
  // 此处编写后续业务逻辑
}).catch(err => {
  console.log('全局异常:', err);
});

代码说明:

  1. 每个请求的状态校验、JSON解析、空数组判断都在自身的异步链里完成,不需要拆分到外层的二次.then中
  2. 所有异常场景都做了捕获,单请求失败只会标记自身为无效,不会触发Promise.all整体失败
  3. 所有请求结束后统一筛选有效结果,修复了原代码只处理第一个类型响应、遗漏其他资源类型的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:48:39