API返回504时如何处理未处理的Promise拒绝问题?
处理Promise拒绝及API 504错误的解决方案
1. 用try/catch捕获await的异常
await 后面的Promise如果被拒绝,会直接抛出异常,必须用try/catch包裹才能捕获,否则会触发未处理的Promise拒绝,进而导致500错误。
try { let data = await queryData([titleName]); // 拿到数据后正常处理逻辑 } catch (error) { // 统一处理错误,比如打日志、返回前端提示 console.error('数据获取失败:', error.message); // 针对504超时做特殊处理 if (error.statusCode === 504) { console.error('请求超时,请稍后重试'); // 这里可以加重试逻辑或者返回对应提示 } }
2. 完善queryData的Promise逻辑,传递具体错误信息
原代码中reject()没有传递错误参数,导致catch块拿不到有效错误信息,不利于排查问题。修改后把错误对象或自定义错误传递给reject:
function queryData(titles) { return new Promise((resolve, reject) => { getData(titles, (err, data) => { if (err) { // 把API返回的错误传递出去 return reject(err); } if (!data) { // 自定义无数据的错误 return reject(new Error('API未返回有效数据')); } resolve(data); }); }); }
3. 在getData中处理504状态码,转换成标准错误对象
需要在实际调用API的getData函数里,把HTTP 504状态码转换成带标识的错误对象,传给回调的err参数,这样上层才能识别并处理:
function getData(titles, callback) { // 这里以axios为例,实际根据你的API调用方式调整 axios.get('/your-api-url', { params: { titles } }) .then(response => { callback(null, response.data); }) .catch(error => { if (error.response?.status === 504) { const timeoutErr = new Error('网关超时(504)'); timeoutErr.statusCode = 504; callback(timeoutErr); } else { // 其他错误直接传递 callback(error); } }); }
这样一套处理下来,既能避免未处理的Promise拒绝,还能针对性处理API返回的504超时错误,同时保留错误详情方便排查。
内容的提问来源于stack exchange,提问作者noufalcep
相关产品推荐
相关产品推荐

