2016-04-09 13 views
2

私は解決しようとしている約束の多次元配列を持っています。私がconsole.logに結果を表示すると、配列を見ることができ、それぞれ[[PromiseStatus]]と[[PromiseValue]]と共に約束することができます。約束の価値をどうやって得るのですか?多次元配列で約束の結果を得る

(resourcePromisesが約束のちょうど多次元配列である):

は、ここでのコードの抜粋です。

Promise.all(resourcePromises).then(function(values) 
    { 
     console.log(values); 
    }); 

そして変数の値は、複数のアレイを保持し、それらのアレイのそれぞれの中に、私はから値をつかむしようとしている約束のリストであるだろう。

+0

期待される出力はどのような値にする必要がありますか?それはまた、約束値を解決した多次元配列であるべきですか? – Matthijs

+0

[約束事の配列のためのpromise.allのやり方は?](http://stackoverflow.com/questions/36094865/how-to-do-promise-all-for-array-of-array- – sheilak

答えて

3

Promise.allを最も深いレベルで実行し、次に深いレベルで実行する必要があるように聞こえます。 2次元配列の場合、それは次のようになります。

Promise.all(promises.map(Promise.all)).then(function(values) { 
    console.log(values); 
}); 

あなたは、任意の深さに行きたいなら、あなたはレベルごとにmapallの間で選択する必要があります:

function deepAll(array) { 
    if (array instanceof Promise) 
     // Just in case... 
     return array; 
    else if (array.length == 0) 
     // The 'real' function will fail with an empty array and it's the same in both cases anyhow. 
     return []; 
    else if (Array.isArray(array[0])) 
     // There's another array level, so turn it into an array of promises. 
     return array.map(deepAll); 
    else 
     // This is an array of promises, and we already have a function for that case. 
     return Promise.all(array); 
} 

deepAll(promises).then(function(values) { 
    console.log(values); 
}); 
+1

私は 'array.length === 0'を使って' undefined'でのトリガを避けるか、 'length'を見る前にタイプをチェックします。そうでないと' plain'がトリガされます。また、信頼できない 'instanceof'を使用するのではなく、' '.then'メソッド(http://stackoverflow.com/q/27746304/918910)をチェックします。 – jib

1

Promise.all反復可能としてかかりますそれは議論です。したがって、多次元配列をスローするイテレータを書くだけでよいでしょう。

function *deepWalk(arr) { 
    for (var item of arr) {  
    if (Array.isArray(item)) 
     yield* deepWalk(item) 
    else 
     yield item; 
    } 
} 

Promise.all(deepWalk(resourcePromises)).then(...