为什么此javascript代码段将显示414243?

or

环境是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.在这里,我以为每个循环都会打印出来4Promise<pending>因为我们还没有运行(队列中的)回调then,这意味着不可能获取每个文件的内容。但是结果却相反,因为它实际上是打印出来的每个文件的内容!

但为什么?我有什么问题吗?我听不懂

安舒尔

原因在这里

console.log(await promise)  

在您的readAll中。

当您进行等待时,它会使javascript等待promise返回。这就是为什么您获得了最终的承诺结果。如果您将以上更改为

console.log(promise)

你会看见

4
Promise<pending>
4
Promise<pending>
4
Promise<pending>

在您的程序输出中,因为此处的javascript不等待诺言返回。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么此代码段显示编译错误?

来自分类Dev

为什么此JavaScript代码段返回true?

来自分类Dev

为什么此javascript代码段记录为1?

来自分类Dev

为什么此代码段无效?

来自分类Dev

为什么此代码段的输出不同?

来自分类Dev

为什么此代码段失败并显示``AttributeError:'CustomAdapter'对象没有属性'setLevel'''?

来自分类Dev

为什么此PHP代码段将登录推送到HTTPS会导致重定向循环?

来自分类Dev

为什么此PHP代码段将登录推送到HTTPS会导致重定向循环?

来自分类Dev

为什么此代码只显示零?

来自分类Dev

为什么此代码显示素数?

来自分类Dev

为什么此代码不显示速度

来自分类Dev

为什么此汇编代码会引发段错误?

来自分类Dev

为什么此C代码段不会导致分段错误?

来自分类Dev

为什么此代码段的输出为-33

来自分类Dev

为什么此sql代码段总是返回8或1?

来自分类Dev

为什么此汇编代码会引发段错误?

来自分类Dev

为什么此程序中没有显示段错误?

来自分类Dev

为什么不执行此JavaScript代码?

来自分类Dev

为什么JavaScript会显示此错误?

来自分类Dev

为什么此代码显示输出17而不显示16?

来自分类Dev

为什么这个简单的JavaScript代码段不起作用

来自分类Dev

为什么以下Javascript代码段的行为如下所示?

来自分类Dev

为什么此代码显示100而不是1?

来自分类Dev

为什么此R ggplot代码显示每年的合计值?

来自分类Dev

为什么此代码显示6而不是5?

来自分类Dev

为什么此组“隐藏/显示”代码无效?

来自分类Dev

为什么此HTML代码无法显示颜色字段?

来自分类Dev

为什么此代码显示异常行为?(未提交表格)

来自分类Dev

为什么此代码未显示找到的位置日志

Related 相关文章

热门标签

归档