当您不捕获 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
,我能想到的唯一解释是第一个writeFile
将foo
写入文件,然后是第二个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/