环境是Nodejs,我有一个名为readFile
异步读取一个文件的基本函数:
let fs = require('fs')
function readFile(fileName) {
return new Promise(function (resolve,reject) {
fs.readFile(fileName,function (error,data) {
if(error) return reject(error)
resolve(data)
})
})
}
另外,我有一个名为readAll
读取所有文件的函数:
async function readAll(paths){
const promises = paths.map(async path => {
return Promise.resolve(readFile(path)).then(res => {
const r = res
return r.toString()
})
})
for(var promise of promises){
console.log(4)
console.log(await promise)
}
}
我这样调用该readAll
函数:
(1.txt的内容是1
,2.txt的内容2
和3.txt的内容是3
):
readAll(['1.txt','2.txt','3.txt'])
我认为它将像这样打印:
4
Promise<pending>
4
Promise<pending>
4
Promise<pending>
但是不,它只是正常打印文件的每个内容,即4 1 4 2 4 3
。我不明白为什么。我根据事件循环分析打印结果:
1.在第一个循环中,整个脚本是一个宏任务,我们运行它。
2.调用paths.map
方法时,我们对数组进行迭代。每次迭代都会运行该async
函数,从而将then
方法的回调放入Promise队列(微任务队列)中。
3.然后继续前进,到达for...of
循环(直到现在我们仍然执行宏任务)。由于此循环是同步的,因此console.log
将调用两者。
4.在这里,我以为每个循环都会打印出来4
,Promise<pending>
因为我们还没有运行(队列中的)回调then
,这意味着不可能获取每个文件的内容。但是结果却相反,因为它实际上是打印出来的每个文件的内容!
但为什么?我有什么问题吗?我听不懂
原因在这里
console.log(await promise)
在您的readAll中。
当您进行等待时,它会使javascript等待promise返回。这就是为什么您获得了最终的承诺结果。如果您将以上更改为
console.log(promise)
你会看见
4
Promise<pending>
4
Promise<pending>
4
Promise<pending>
在您的程序输出中,因为此处的javascript不等待诺言返回。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句