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); });
代码说明:
- 每个请求的状态校验、JSON解析、空数组判断都在自身的异步链里完成,不需要拆分到外层的二次
.then中- 所有异常场景都做了捕获,单请求失败只会标记自身为无效,不会触发
Promise.all整体失败- 所有请求结束后统一筛选有效结果,修复了原代码只处理第一个类型响应、遗漏其他资源类型的问题
内容的提问来源于stack exchange,提问作者Aristocles
相关产品推荐
相关产品推荐

