javascript - 按 "wrong"顺序执行的嵌套 Promise

标签 javascript node.js promise

我正在尝试以 a+ 模式打开 2 个文件,然后尝试读取它们的内容并将其发送回用户。我使用嵌套回调实现了它,但我想尝试使用 Promises 来实现它,因此我编写了以下内容:

var chain1 = [];  
var c1Promise1 = new Promise(func(res,rej){  
   fs.open('path','a+',func(err,fd){  
     if(err)  
       {rej(err)}  
     else  
       {res(fd)}  
     })  
chain1.push(c1Promise1)  
//Same thing for the second promise, just different path  
Promise.all(chain1).then(fds=>{
    var chain2 = []  
    var c2Promise1 = new Promise(func(res,rej){  
       fs.readFile(fds[0],'utf-8',func(err,data){
          console.log("data1 = " + data)  
          if(err){  
            rej(err)
          }  
          else{  
            res(data)  
          }  
       })  
})
chain2.push(c2Promise1)
//Same thing for c2Promise2 but different fd (fds[1]) and .log("data2 = " + data)
Promise.all(chain2).then(data=>{
       console.log("data3 and 4 = " + data[0] + ' ' + data[1])
   },err=>next(err))
},err=>next(err))  

On console i get:  
"data3 and 4" = undefined undefined    
"data1 = " actual data in the file  
"data2 = " actual data in the file.   

我错过了什么吗?这不是应该表现得像 data1、data2 然后只有 data 3 和 4!?感谢您的帮助

最佳答案

Promise.all() 立即返回,不等待 Promise 完成。
因此,在您的情况下,第一个 Promise.all 下面的所有内容都应该位于 .then() block 中。

顺便说一下,这种代码很难阅读。您可以尝试使用直接处理 Promise 的 fs = require('mz/fs') 。也许可以使用 async/await。

类似于: 让 fs = require('ms/fs'); 让 data1 =等待 fs.readFile(path1, 'utf8'); 让 data2 =等待 fs.readFile(path2, 'utf8');

关于javascript - 按 "wrong"顺序执行的嵌套 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44203820/

相关文章:

javascript - 使用 Jest 和 @std/esm 模拟 Node 模块

javascript - 使用正则表达式获取 url 变量

javascript - Three.ar.js 不良的宽高比会导致图像拉伸(stretch)?

node.js - 调试永远无法解决 promise /异步等待

javascript - 如何调用 "document.getElementBytag()"创建的数组中的元素?

node.js - 如何在 cassandra 中执行查询后立即插入行?

javascript - 强制 csv-write-stream 始终使用双引号(nodejs 和 electrojs)

javascript - mysql连接的模块导出

javascript - Promise js方法时如何避免逻辑重复?

javascript - 返回一个 promise 抛出错误的 Promise