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

