2016-04-09 16 views
2

Çözmeyi denediğim çok boyutlu bir söz dizim var. Sonuçta konsol.log eğer dizileri görüntüleyebilir ve her birinde bir [[PromiseStatus]] ve bir [[PromiseValue]] ile birlikte vaadidir. Söz değeri nasıl alabilirim?Çok boyutlu bir dizide bir sözün sonuçlarını alma

(resourcePromises vaatleri sadece çok boyutlu bir dizidir):

İşte kod snippet'idir bu.

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

Sonra değişken değerleri çoklu diziler yapacak ve bu dizilerin her biri içinde ben değerleri kapmak için çalışıyorum vaatler listesidir.

+0

Beklenen çıktı değerler içinde ne olmalıdır? Aynı zamanda çözümlenmiş verim değerlerine sahip çok boyutlu bir dizi mi olmalı? – Matthijs

+0

Olası çoğaltılabilir [Sözler dizisi dizisi için nasıl promise.all yapılır?] (Http://stackoverflow.com/questions/36094865/how-to-do-promise-all-for-array-of-array- of-promises) – sheilak

cevap

3

Promise.all'u en derin seviyeye, ardından bir sonraki en derin, ve en üste gelene kadar çalıştırın. 2B diziler için, bu şöyle olacaktır:

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

'undefined'de tetiklemeyi önlemek için' array.length === 0' öğesini ya da 'length''e bakmadan önce türünü kontrol etmeliyim, aksi takdirde bu' false değerleri tetikleyebilir. Ayrıca, güvenilmez olan 'instanceof' kullanmak yerine [' .then' yöntemini kontrol etmeliyim] (http://stackoverflow.com/q/27746304/918910). – jib

1

Promise.alliterable olarak alır: Eğer keyfi derinliklerine gitmek istiyorsanız

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

sonra her seviye için map ve all arasında seçim yapmak gerekir bu argüman. Dolayısıyla, çok boyutlu dizinizi attıran bir yineleyici yazmanız yeterlidir.

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

Promise.all(deepWalk(resourcePromises)).then(... 
İlgili konular