首先,我有一个异步函数,它将消息记录在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关键字的方式是否存在缺陷?
如果您的逻辑不需要async
调用的结果,则没有必要。尽管在您的情况下不需要,documentation列出了启用该警告的两个好处:
虽然通常不需要这样做,但它有两个主要好处。第一个是,使用try-catch包围代码时,您不会忘记添加“ await”。第二个问题是具有显式的“等待”有助于V8运行时提供异步堆栈跟踪]
当您将异步设置为方法时,该方法希望在其作用域内使用await。因为async关键字的功能就像您要告诉方法在其作用域内存在另一个过程,必须先完成另一个过程才能继续进行方法过程。
换句话说,如果您不想等待其他过程完成,则应避免在方法中使用async关键字。
这里,await关键字很有意义:
await msg.save();
因为它等待完成,直到完成日志。但是在方法中,您希望所有方法都运行而不必等待其他进程结束。只是不要使用asyn关键字。如果您不想在这里等待:
await this.rs.reply(username, message, this);
不要在这里使用异步:
async getReply(username, message)
如果您需要在getReply中等待,那么您应该添加async关键字,否则,不必添加该关键字。
[每当您要等待某个操作时,都必须将其与await相关联,但是在与await相关联之前,您需要使父函数异步。
尽管我在这里看到你的答案。
现在让我告诉你!
异步函数不一定要在其中具有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;
}