【发布时间】:2022-01-21 01:10:34
【问题描述】:
在带有回调的函数(例如 fs.writeFile)上使用 await 时,await 不会等待回调中的代码执行。例如:
const fs = require("fs")
async function test() {
for (let i = 0; i < 3; i++) {
console.log(`processing ${i}`)
const fileName = `${i}.json`
await fs.writeFile(fileName, JSON.stringify(i), err => {
if (err) throw err
console.log(`file ${i} is written`)
})
console.log(`${i} is done.`)
}
}
test()
以上代码产生:
processing 0
0 is done.
processing 1
1 is done.
processing 2
2 is done.
file 1 is written
file 0 is written
file 2 is written
代替:
processing 0
file 0 is written
0 is done.
processing 1
file 1 is written
1 is done.
processing 2
file 2 is written
2 is done.
谁能解释一下为什么 await 不能让它在继续之前完成写入文件?
【问题讨论】:
-
因为
writeFile不适用于承诺。 -
await 与承诺一起工作,但这里 fs.writeFile 不是承诺。 stackoverflow.com/questions/31978347/…
-
你不能
await标准writeFile- 它不会返回承诺。但!你可以use the new promisified version ofwriteFile。只需确保您的 Node 版本是最新的。 -
await并不神奇地知道回调。它只等待作为其操作数的承诺。