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

JavaScript:如何反向处理成功Promise?优化API错误处理代码

优化API响应处理:将非200状态的JSON结果作为错误抛出

嘿,这个场景我天天碰到!你的原始代码能工作,但确实有更简洁、更可靠的写法,还能避免一些潜在的小问题。

先说说你提到的return Promise.reject(result.json)为什么不行:result.json()返回的是一个Promise对象,直接把它传给Promise.reject()的话,你在catch里拿到的会是这个Promise本身,而不是解析后的JSON数据。要把解析后的数据作为错误抛出,必须先等待json()完成,再处理结果。

下面是几种更优的实现方式:

方式一:统一解析后判断状态(最清晰)

先统一解析JSON,再根据状态码决定返回数据还是抛出错误,这种写法更直观,还能避免重复调用result.json():

return result.json().then(data => {
  // 用result.ok判断更通用,它等价于状态码在200-299之间
  if (!result.ok) {
    throw data; // 在then里throw会自动转为rejected的Promise
  }
  return data;
});

方式二:简化为箭头函数(更紧凑)

如果偏爱简洁风格,可以用三元表达式压缩成一行:

return result.json().then(data => 
  result.ok ? data : Promise.reject(data)
);

方式三:封装复用函数(推荐大型项目)

如果多个地方都需要处理这种逻辑,封装成工具函数会更高效,还能统一补充错误上下文:

function handleApiResponse(response) {
  return response.json().then(data => {
    if (!response.ok) {
      // 给错误对象添加状态码、原始数据等额外信息
      const error = new Error('API请求失败');
      error.status = response.status;
      error.details = data;
      throw error;
    }
    return data;
  });
}

// 使用示例:
fetch('/api/your-endpoint')
  .then(handleApiResponse)
  .then(validData => { /* 处理成功数据 */ })
  .catch(error => { /* 这里拿到带状态码和错误详情的对象 */ });

总结一下:核心思路是先解析JSON,再根据响应状态决定是返回还是抛出解析后的数据,而不是直接rejectjson()返回的Promise。这样就能确保catch里拿到的是真正的错误信息啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:38:27