2017-04-14 20 views
2

reduceを持つ配列に対して2つのコードスニペット(Parallel、Sequential)を単純なAsync関数で実行しています。私はPromise.allに電話するまで実行が開始されない理由を理解していません。これを行うにはこれが最善の方法ですか?Async/Await inside Array関数reduce

// Function returning promise with root value 
async function proot(x) { 
    return new Promise((res,rej)=>{ 
     setTimeout(() => { 
      console.log(x*x); 
      res(x*x) 
     },1000)  
    }) 
} 

// Parallel Execution 
var arr1 = [2,3,4].reduce((prev,next)=>{ 
    return prev.concat(proot(next)) 
},[]) 
arr1 = await Promise.all(arr1) 

// Sequential Execution 
var arr2 = [2,3,4].reduce(async (prev,next)=>{ 
    return (await prev).concat(await proot(next)) 
},Promise.resolve([])) 
arr2 = await Promise.all([arr2]) 
+0

はジャスト)第2の連続実行がPromise.allを(呼び出すことなく動作することを追加したいです。おそらく、これはjavascriptではなく、私のIDEとmochaと関係があります。 – ucipass

答えて

1

約束内部のコードは、あなたが約束を返す関数を呼び出す際に実行されます:

// Parallel Execution 
var arr1 = [2,3,4].reduce((prev,next)=>{ 
    return prev.concat(proot(next)) 
},[]) 

をしかし、それは代わりに価値の約束を返します。あなたはそれが解決する価値を得る約束を処理する必要があります。

reduceを使用する必要はありません。地図は、あなたのケースで動作します:

var arr = [2,3,4].map((n) => proot(n)); 
Promise.all(arr).then((values) => {}) 

または:私はデバッグを使用しない場合

var arr = [2,3,4].map(async (n) => await proot(n)); 
+1

アルベルト、私はあなたの答えを正しく記入します。これは投稿された質問を解決するためです。私は実際に私の配列の単一のメンバの代わりに複数の配列要素を挿入する必要があるかもしれないので、縮小の内部にconcatを使用する必要があります。その間、私はちょうど私がsetTimeout関数をデバッグしている間に何らかの形でネットが起動することを認識しました。そのため、私はPromise.allを呼び出すまで私の画面に結果を表示しませんでした。実際に私は結果を得るためにpromise.allを呼び出す必要はありません。 – ucipass

関連する問題