在同步代码中使用异步功能

时间:2018-11-15 23:33:33

标签: node.js

我正在使用一个名为sqs-consumer的库来处理SQS消息。该库希望消息处理程序看起来像这样:

handleMessage: (message, done) => {
    // do some work with `message`
    done();
}

尽管我有异步代码

async function sendEmail() {
    return await ...
}

是否有很好的方法在sendEmail中运行handleMessage,等待其完成,然后调用done

2 个答案:

答案 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();
}