簡體   English   中英

嵌套的承諾以“錯誤”的順序執行

[英]Nested Promises executed in the “wrong” order

我試圖以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,然后才是數據3和4! 感謝幫助

Promise.all()返回就是不等待諾言完成。
因此,在您的情況下,第一個Promise.all以下的所有內容都應位於Promise.all .then()塊中。

順便說一句,這種代碼很難閱讀。 您可以嘗試使用直接處理諾言的fs = require('mz/fs') 也許使用異步/等待。

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

承諾是異步的。 因此,一個接一個地開始多個承諾並不意味着它們被執行了/它們按順序完成了。

如果我的理解是正確的,那么您的代碼基本上會執行以下操作(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
);

如果您希望按順序執行鏈(!仍然不必按順序執行鏈中的promise),則應該對promise進行鏈式處理:

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

甚至更好:按照Nico的建議使用async / await

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM