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

如何在Node.js异步函数中从非Promise回调返回值以支持await调用

解决方案

你的createSubscription函数虽然标记了async,但内部调用的sqs.createQueue是回调风格,函数本身没有返回任何Promise,所以调用者用await无法拿到结果。要实现需求,有两种常用方式:

方式一:手动封装Promise

把回调逻辑包裹在Promise里,通过resolve返回成功结果,reject抛出错误:

async function createSubscription(name, req){
  var params = {
    QueueName: name,
    Attributes: {
        'ReceiveMessageWaitTimeSeconds': '20', // long polling wait time
    }
  };

  return new Promise((resolve, reject) => {
    sqs.createQueue(params, function(err, data) {
      if (err) {
        logger.error("createQueue error : " + err, req);
        reject(err); // 抛出错误,允许调用者捕获
      } else {
        logger.log("queue " + name + ' created', req);
        resolve(data.QueueUrl); // 返回队列URL
      }
    });
  });
}

方式二:使用AWS SDK自带的Promise支持

如果你的AWS SDK版本较新,直接调用方法的.promise()接口,配合async/await写法更简洁:

async function createSubscription(name, req){
  var params = {
    QueueName: name,
    Attributes: {
        'ReceiveMessageWaitTimeSeconds': '20', // long polling wait time
    }
  };

  try {
    const data = await sqs.createQueue(params).promise();
    logger.log("queue " + name + ' created', req);
    return data.QueueUrl;
  } catch (err) {
    logger.error("createQueue error : " + err, req);
    throw err; // 抛出错误给调用者处理
  }
}

调用示例

调用者可以正常用await获取结果,同时建议用try/catch处理可能的错误:

try {
  var url = await createSubscription('foo', req);
  // 拿到URL后执行后续逻辑
} catch (err) {
  // 处理队列创建失败的情况
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 02:03:20