Node.js 在同步代码中使用异步函数

Node.js 在同步代码中使用异步函数,node.js,Node.js,我正在使用一个名为的库来处理SQS消息。库希望消息处理程序如下所示: handleMessage: (message, done) => { // do some work with `message` done(); } 另一方面,虽然我有异步代码 async function sendEmail() { return await ... } 有没有一种好方法可以在handleMessage中运行sendEmail,等待它完成,然后调用done?您可以在回调中

我正在使用一个名为的库来处理SQS消息。库希望消息处理程序如下所示:

handleMessage: (message, done) => {
    // do some work with `message`
    done();
}
另一方面,虽然我有异步代码

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

有没有一种好方法可以在
handleMessage
中运行
sendEmail
,等待它完成,然后调用
done

您可以在回调中使用基于承诺的代码,如下所示:

handleMessage: (message, done) => {
    // do some work with `message`
    sendEmail().then(done).catch(...);
}
在某些情况下,您还可以为
handleMessage()
创建一个新方法,该方法实际上期望返回一个承诺,并直接使用该承诺,而不是使用普通回调


另外,并不是说在函数末尾使用
return wait…
没有意义。您可以直接退还承诺:

handleMessage: async (message, done) => {
    await sendEmail();
    done();
}
因此,不是:

async function sendEmail() {
    // other code here
    return await someFuncThatReturnsPromise();
}
您只需执行以下操作:

async function sendEmail() {
    // other code here
    return someFuncThatReturnsPromise();
}

额外的
等待
不会增加任何价值或效用。

您可以在回调中使用基于承诺的代码,如下所示:

handleMessage: (message, done) => {
    // do some work with `message`
    sendEmail().then(done).catch(...);
}
在某些情况下,您还可以为
handleMessage()
创建一个新方法,该方法实际上期望返回一个承诺,并直接使用该承诺,而不是使用普通回调


另外,并不是说在函数末尾使用
return wait…
没有意义。您可以直接退还承诺:

handleMessage: async (message, done) => {
    await sendEmail();
    done();
}
因此,不是:

async function sendEmail() {
    // other code here
    return await someFuncThatReturnsPromise();
}
您只需执行以下操作:

async function sendEmail() {
    // other code here
    return someFuncThatReturnsPromise();
}

额外的
await
不会增加任何价值或效用。

只要库不关心您从
handleMessage返回的内容
,您也可以直接在handlerMessage函数中使用async/await:

handleMessage: async (message, done) => {
    await sendEmail();
    done();
}

只要库不关心您从handleMessage返回的内容,您也可以直接在handleMessage函数中使用async/await:

handleMessage: async (message, done) => {
    await sendEmail();
    done();
}

可能重复的注意事项是
return await
如果这是函数中使用的唯一
await
,那么它是毫无意义的-只需使用标准函数即可,您可以简单地
return
普通
Promise
注意
return await
的可能副本,如果这是您在函数中使用的唯一
await
,那么它是毫无意义的-只需使用一个标准函数,您可以简单地
return
普通
Promise