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

问题描述 投票:2回答:4

首先,我有一个异步函数,它将消息记录在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)
    }
}

现在,我还有另一个异步函数,当我收到一条消息并处理和获取一些数据时,就会触发该异步函数。触发此函数后,我立即调用“ log_message”将消息记录在数据库中,但是我不想使用await来调用它,否则,我将等到“ 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;
    }

但是,Jetbrains Webstorm给我这个警告“缺少等待异步函数调用”。现在,我进行了一些测试,如果不等待就调用该函数,则系统将按预期运行,消息将得到处理,并且我的日志记录函数将数据异步写入db而不中断。如果相反,我在调用日志记录函数之前放了await关键字,则主函数中代码的执行将被挂起,直到尚未写入数据库为止。

有人可以告诉我使用async / await关键字的方式是否存在缺陷?

javascript node.js asynchronous callback async-await
4个回答
1
投票

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

虽然通常不需要这样做,但它有两个主要好处。第一个是,使用try-catch包围代码时,您不会忘记添加“ await”。第二个问题是具有显式的“等待”有助于V8运行时提供异步堆栈跟踪]


0
投票

当您将异步设置为方法时,该方法希望在其作用域内使用await。因为async关键字的功能就像您要告诉方法在其作用域内存在另一个过程,必须先完成另一个过程才能继续进行方法过程。

换句话说,如果您不想等待其他过程完成,则应避免在方法中使用async关键字。

这里,await关键字很有意义:

await msg.save();

因为它等待完成,直到完成日志。但是在方法中,您希望所有方法都运行而不必等待其他进程结束。只是不要使用asyn关键字。如果您不想在这里等待:

await this.rs.reply(username, message, this);

不要在这里使用异步:

async getReply(username, message)

如果您需要在getReply中等待,那么您应该添加async关键字,否则,不必添加该关键字。


0
投票

[每当您要等待某个操作时,都必须将其与await相关联,但是在与await相关联之前,您需要使父函数异步。


0
投票

尽管我在这里看到你的答案。

现在让我告诉你!

异步函数不一定要在其中具有await调用,但是使函数异步的原因是,您需要一个异步调用,您需要对其进行等待才能在线程中前进之前等待结果。

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

以上功能可以使用,但是为什么要使其异步呢?由于您没有使用任何异步功能。如果用于以下用途,则其作用相同:-

getReply(username, message) {
        log_message("user", username, message);
        console.log("HI");
        let reply = await this.rs.reply(username, message, this);
        return reply;
    }
© www.soinside.com 2019 - 2024. All rights reserved.