是否总是需要使用 await 调用异步函数?

Mol*_*ehh 9 javascript asynchronous callback node.js async-await

首先是一些上下文,我有一个异步函数,它在 MongoDB 数据库上记录消息。

async function log_message(sender, conversationId, text) {
    try {
        const msg = new Message({
            sender: sender,
            conversationId: conversationId,
            text: text
        });
        await msg.save();
        console.log("Done");
    } catch (e) {
        console.log("An error happened while logging the message: " + e)
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我有另一个异步函数,当我收到一条消息并负责处理它并获取一些数据时,它会被触发。一旦这个函数被触发,我就会调用“log_message”来将消息记录到我的数据库中,但我不想用等待调用它,否则,我会等到“log_message”函数返回之前处理消息减慢速度消息处理。

    async getReply(username, message) {
        log_message("user", username, message);
        console.log("HI");
        let reply = await this.rs.reply(username, message, this);
        return reply;
    }
Run Code Online (Sandbox Code Playgroud)

尽管如此,Jetbrains Webstorm 给了我这个警告“缺少等待异步函数调用”。现在,我做了一些测试,如果我在没有 await 的情况下调用该函数,系统会按照我的预期运行,消息会得到处理,我的日志记录函数会在不中断的情况下异步将数据写入数据库。如果相反,我在调用日志函数之前放置了 await 关键字,则主函数中代码的执行将暂停,直到数据库尚未写入。

有人能告诉我我打算使用 async/await 关键字的方式是否存在一些缺陷?

sma*_*oes 6

如果您的逻辑不需要async调用结果,则没有必要。尽管在您的情况下不需要,但文档列出了启用该警告的两个好处:

虽然这通常不是必需的,但它有两个主要好处。第一个是当你用 try-catch 包围你的代码时,你不会忘记添加“await”。第二个是明确的“await”有助于 V8 运行时提供异步堆栈跟踪