Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在“中执行的嵌套承诺”;“错误”;秩序_Javascript_Node.js_Promise - Fatal编程技术网

Javascript 在“中执行的嵌套承诺”;“错误”;秩序

Javascript 在“中执行的嵌套承诺”;“错误”;秩序,javascript,node.js,promise,Javascript,Node.js,Promise,我正在尝试以+模式打开2个文件,然后尝试读取它们的内容并将其发送回用户。我使用嵌套回调实现了它,但我想尝试使用承诺实现它,因此我写了以下内容: var chain1 = []; var c1Promise1 = new Promise(func(res,rej){ fs.open('path','a+',func(err,fd){ if(err) {rej(err)} else {res(fd)} })

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

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.   

我遗漏了什么吗?难道这不应该表现为,数据1,数据2,然后才是数据3和4!?感谢您的帮助

承诺用于异步。因此,一个接一个地开始多个承诺并不意味着它们被执行/按顺序完成

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

如果希望链按顺序执行(!链中的承诺仍然不必按顺序执行),则应将承诺按顺序执行:

var chain1 = [c1promise1, c2promise2];
Promise.all(chain1).then( // wait for execution
    return [c2promise1, c2promise2];
).all(chain2).then(
    // do sth
);
或者更好:按照Nico的建议使用async/await。all()立即返回不是等待承诺完成。
因此,在您的情况下,第一个
承诺下面的所有内容。所有
都应该在
中。然后()
块中

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

比如:

设fs=require('ms/fs');
让data1=等待fs.readFile(路径1,'utf8');
让data2=等待fs.readFile(路径2,'utf8');

不,它们应该是嵌套的!Promise.all(chain2)在Promise内创建和执行。all(chain1)因此订单是guardanteed。但我是如此的迟钝,我错过了封闭的括号!至少在我的代码中,现在修复了它。对不起,浪费时间了
var chain1 = [c1promise1, c2promise2];
Promise.all(chain1).then( // wait for execution
    return [c2promise1, c2promise2];
).all(chain2).then(
    // do sth
);