我正在使用一个名为sqs-consumer的库来处理SQS消息。该库希望消息处理程序看起来像这样:
handleMessage: (message, done) => {
// do some work with `message`
done();
}
尽管我有异步代码
async function sendEmail() {
return await ...
}
是否有很好的方法在sendEmail
中运行handleMessage
,等待其完成,然后调用done
?
答案 0 :(得分:1)
您可以在回调中使用基于承诺的代码,如下所示:
handleMessage: (message, done) => {
// do some work with `message`
sendEmail().then(done).catch(...);
}
在某些情况下,您还可以为handleMessage()
创建一个新方法,该方法实际上期望返回一个诺言并直接使用该诺言,而不是根本不使用简单的回调。
此外,并非没有必要在函数结尾使用return await ...
。您可以直接返回承诺:
所以,而不是:
async function sendEmail() {
// other code here
return await someFuncThatReturnsPromise();
}
您可以这样做:
async function sendEmail() {
// other code here
return someFuncThatReturnsPromise();
}
多余的await
不会增加任何价值或实用性。
答案 1 :(得分:1)
只要库不关心您从handleMessage
返回的内容,您还可以直接在handlerMessage函数中使用async / await:
handleMessage: async (message, done) => {
await sendEmail();
done();
}