javascript - 在异步函数中使用await关键字与省略它有什么区别?

标签 javascript async-await

当您不捕获 await 调用的返回值时,使用 await 关键字与省略它有何不同?

例如,这4个文件的创建方式有什么不同吗?因为如果我运行这个,它们都会被创建,所以我想知道。

const fs = require('fs');
const { promisify } = require('util');
const writeFile = promisify(fs.writeFile);

(async function () {
    await writeFile('a.txt', 'aaa');
    await writeFile('b.txt', 'bbb');
    writeFile('c.txt', 'ccc');
    writeFile('d.txt', 'ddd');
})()

更新:

我尝试了一些测试,看起来它的行为与答案一致,但最终,事情变得很奇怪。

因此,如果您运行以下命令,

writeFile('a.txt', 'foo');
writeFile('a.txt', 'bar');
const content = await readFile('a.txt', 'utf8');
console.log(content);

输出有时是foo,有时是bar,这似乎两个writeFile调用同时触发,谁最后完成取决于运气好。

所以我把它改为:

writeFile('a.txt', 'foo');
await writeFile('a.txt', 'bar');
const content = await readFile('a.txt', 'utf8');
console.log(content);

我认为(基于答案)这总是会输出 bar,但再次输出有时是 foo,有时是 bar
我不确定我是否理解,因为我以为我在等待写入 bar 的调用,所以唯一的解释是第一个 writeFile 调用以某种方式在等待电话。

然后我在调用之间设置了延迟:

writeFile('a.txt', 'foo');
[...Array(400000).fill('hello')].join('\n')
writeFile('a.txt', 'bar');
const content = await readFile('a.txt', 'utf8');
console.log(content);

这次它总是输出bar

然后奇怪的事情发生了。
如果您运行以下命令:

writeFile('a.txt', 'foo');
[...Array(40000).fill('hello')].join('\n')
writeFile('a.txt', 'b');
const content = await readFile('a.txt', 'utf8');
console.log(content);

输出是boo,我能想到的唯一解释是第一个writeFilefoo写入文件,然后是第二个writeFile 开始写入文件,但在完成之前,等待的 readFile 会读取文件。 (笑)

最佳答案

它只是不等待结果。它只会触发并忘记异步任务。在大多数情况下,这不是您想要的,因为代码运行无序并且错误未被处理

 await writeFile(); // If an error occurs in writeFile, the promise returned by this function will reject too
 await writeFile(); // this will definetly run after the previous call completed.

关于javascript - 在异步函数中使用await关键字与省略它有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57896499/

相关文章:

javascript - 创建 Instagram API 地理订阅时出现 CORS 问题

javascript - 为什么相同的日期有不同的时间?

asp.net-core - 用于 spa 和异步的 Net core API

c# - 依赖注入(inject)的 UserManager 正在处理异步调用 (ASP.NET CORE)

Javascript filter() 返回所有数据。不过滤匹配项

javascript - 浏览器会编译和缓存 javascript 吗?

javascript - 在 html 标记中使用冒号并在 javascript 中处理其元素

javascript - 在异步 Jest 测试中是否需要完成?

javascript - 函数在await执行完成之前返回

c# - 异步调用时 Azure KeyVault Active Directory AcquireTokenAsync 超时