2017-05-26 65 views
0

我試圖在+模式下打開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!?感謝您的幫助

回答

0

承諾是爲了異步。因此一個接一個地啓動多個承諾並不意味着他們被執行/他們按順序完成。

如果我的理解的權利你的代碼做基本如下(僞JS代碼):

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 
); 

甚至更​​好:使用異步/ AWAIT作爲

+0

沒有他們應該被嵌套Promise.all(鏈2)和內Promise.all(鏈1),因此訂單guardanteed執行:

喜歡的東西!但即時通訊我這樣一個小姐閉嘴括號!至少在我的代碼中,現在修復它。對不起浪費時間 –

1

Promise.all()立即返回提出Nico絕對不不等待承諾完成。
所以在你的情況下,第一個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');