2017-05-26 15 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. 

私が何かをしないのです、これはのように振る舞うように想定されていない、だけにしてDATA1、DATA2と?データ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 
); 

またはより良い:

+0

!。しかし、このようなtard私はミスを閉じた括弧!少なくとも私のコードでは、今それを修正しました。時間を無駄にして申し訳ありません –

1

Promise.all()復帰すぐニコによって提案されたようasyncののawaitない/使用あなたが約束をチェーンなければならない)の順序で実行されますお約束が待たれることはありません。
あなたの場合、最初のPromise.allより下のものはすべて.then()ブロックにある必要があります。

ところで、この種のコードは読みにくいです。約束を直接処理するfs = require('mz/fs')を使用することができます。そして、async/awaitを使うかもしれません。

ような何か:何彼らは入れ子にすることになっていなかったPromise.all(chain2)はPromise.all(CHAIN1)内に作成され、実行されるため、注文がguardanteedさ let fs = require('ms/fs'); let data1 = await fs.readFile(path1, 'utf8'); let data2 = await fs.readFile(path2, 'utf8');

関連する問題