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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:20:33