为什么等待不等待回调?



当对带有回调的函数(如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.

有人能解释一下为什么wait在继续之前没有让它完成文件的写入吗?

这是因为writeFile不返回Promise,而await在暂停执行之前等待Promise解析。您可以升级到writeFile的最新版本,也可以编写返回promise:的函数

const fs = require("fs")
async function test() {
for (let i = 0; i < 3; i++) {
console.log(`processing ${i}`)
const fileName = `${i}.json`
await writeToFile(fileName, i);
console.log(`${i} is done.`)
}
}
function writeToFile(fileName, index) {
return new Promise((resolve, reject) => {
fs.writeFile(fileName, JSON.stringify(index), err => {
if (err) {
// denotes failure
reject(err)
}
console.log(`file ${index} is written`);
// denotes success
resolve(true)
})
});
}
test()

最新更新