我想创建一个异步函数,所以我只需添加async如下:
public async static void something(){
}
Run Code Online (Sandbox Code Playgroud)
你可以看到它的返回类型是void.我只是想这一功能,必须异步调用不会阻塞,因为回报void所以没有await需要.
但Visual Studio 2012只是无法编译这个,它说我想念await?
你能告诉一个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 关键字的方式是否存在一些缺陷?
来自 MDN
异步函数通过事件循环以与其余代码不同的顺序运行,
但是,我不明白这对于一个不显式返回任何内容并且根本不使用 await 的简单函数意味着什么。在这种情况下声明一个函数 async 有什么用吗?它是否会在稍后执行以允许页面响应,例如在执行时?我的测试表明它是同步执行的,根本没有延迟:
async function foo() {
console.log('Start heavy stuff');
for (let i = 0; i < 90000000; ++i) {
Math.random()
}
console.log('Fnish heavy stuff')
}
foo();
console.log('All done, synchronously');Run Code Online (Sandbox Code Playgroud)
日志按预期顺序显示,那么在这种情况下可以使用使此函数异步吗?这与使用 调用此函数有任何相似之处setTimeout(foo, 0)吗?
async-await ×3
asynchronous ×2
javascript ×2
c# ×1
c#-5.0 ×1
callback ×1
event-loop ×1
node.js ×1