【问题标题】:Nested Promises executed in the "wrong" order以“错误”顺序执行的嵌套 Promise
【发布时间】:2017-05-26 23:42:43
【问题描述】:

我正在尝试以 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!?感谢您的帮助

【问题讨论】:

    标签: javascript node.js promise


    【解决方案1】:

    Promise.all()马上返回是不等待promise完成。
    因此,在您的情况下,第一个 Promise.all 以下的所有内容都应该在 .then() 块中。

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

    类似: let fs = require('ms/fs'); let data1 = await fs.readFile(path1, 'utf8'); let data2 = await fs.readFile(path2, 'utf8');

    【讨论】:

      【解决方案2】:

      promises 用于异步。因此,一个接一个地启动多个 Promise 并不意味着它们被执行/它们按顺序完成。

      如果我的理解是正确的,您的代码基本上执行以下操作(psuedo-js-code):

      var chain1 = [c1promise1, c2promise2];
      Promise.all(chain1).then( // wait for execution
          var chain2 = [c2promise1, c2promise2];
      );
      Promise.all(chain2).then( // at this point in time the execution of chain1 doesn't have to be finished!
          // do sth
      );
      

      如果你希望链按顺序执行(!链中的承诺仍然不必按顺序执行)你应该链接承诺:

      var chain1 = [c1promise1, c2promise2];
      Promise.all(chain1).then( // wait for execution
          return [c2promise1, c2promise2];
      ).all(chain2).then(
          // do sth
      );
      

      甚至更好:使用 Nico 建议的 async/await

      【讨论】:

      • 不,它们应该是嵌套的!Promise.all(chain2) 是在 Promise.all(chain1) 中创建和执行的,因此顺序是受保护的。但是我太迟了,我错过了闭括号!至少在我的代码中,现在修复它。抱歉浪费时间
      猜你喜欢
      • 2017-01-24
      • 2017-11-24
      • 2016-08-07
      • 2020-03-13
      • 2020-06-11
      • 1970-01-01
      • 2015-03-15
      • 1970-01-01
      相关资源
      最近更新 更多