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
相关产品推荐
相关产品推荐

