2016-02-09 16 views
9

Varsayılan olarak Promise.All ([]) işlevi, her bir sözün sonucunu içeren bir sayı tabanlı dizin dizisi döndürür.Promise.all ile ad tabanlı sonuçlar elde etmek için en iyi es6 yolu

var promises = []; 
promises.push(myFuncAsync1()); //returns 1 
promises.push(myFuncAsync1()); //returns 2 
Promise.all(promises).then((results)=>{ 
    //results = [0,1] 
} 

() Promise.all ile sonuçların isimli bir dizin döndürmek için en iyi vanilya yolu nedir?

Bir harita ile çalıştı, ama bir dizide bu şekilde sonuç verir: [key1, value1, key2, value2]

GÜNCELLEME:

Sorularım burada, belirsiz görünüyor neden ben sipariş Seviyorum kalmamasıdır tabanlı dizin:

  1. o korumak için bok var: eklerseniz Kodunuzdaki bir söz, indeksin değişikliğe sahip olabileceğinden, sonuçların tamamını yeniden yazmanız gerekebilir. results[42] (aşağıda jib yanıt ile sabitlenebilir)
  2. dinamik bağlamda gerçekten kullanışlı değil:
  3. o okumak korkunç
var promises = []; 
if(...) 
    promises.push(...); 
else{ 
    [...].forEach(... => { 
     if(...) 
      promises.push(...); 
     else 
      [...].forEach(... => { 
       promises.push(...); 
      }); 
    }); 
} 
Promise.all(promises).then((resultsArr)=>{ 
    /*Here i am basically fucked without clear named results 
     that dont rely on promises' ordering in the array */ 
}); 
+0

Yapabilir miyim, yapamaz mısın? "Adlı" ile, anahtar ve değerlerle bir nesneyi kastettiğinizi ve bu tuşların ne olacağını ve ne elde etmeyi beklediğinizi varsayırım. – adeneo

+0

RSVP gibi birçok kitaplık bir karma yöntemi uygular. ['MyFuncAsync1', 'myFuncAsync2'] gibi başka bir diziye ihtiyacınız olabilir. Ve sonra Promise.all (promises) .then ((results) => { var temp = {}; results.forEach ((sonuç, index) => { temp [promisesNames [index]] gibi sonuçların haritasını çıkar = sonuçlanabilir; }); dönüş sıcaklığı; } .o (sonuç => {}) – blessenm

+1

o jQuery hangi $ .her (deffered1, deffered2) .done yapabilirsiniz vaat gibi değil çok kötü (function (result1 , sonuç2) {...}) – phenxd

cevap

5

bu tür bir şey var mı?

var promises = []; 
promises.push(myFuncAsync1().then(r => {name : "func1", result : r})); 
promises.push(myFuncAsync1().then(r => {name : "func2", result : r})); 
Promise.all(promises).then(results => { 
    var lookup = results.reduce((prev, curr) => { 
     prev[curr.name] = curr.result; 
     return prev; 
    }, {}); 
    var firstResult = lookup["func1"]; 
    var secondResult = lookup["func2"]; 
} 
27

ES6 strüktür destekler, böylece sadece sonuçları isim isterseniz yazabilirsiniz: Firefox ve Chrome

var myFuncAsync1 =() => Promise.resolve(1); 
 
var myFuncAsync2 =() => Promise.resolve(2); 
 

 
Promise.all([myFuncAsync1(), myFuncAsync2()]) 
 
    .then(([result1, result2]) => console.log(result1 +" and "+ result2)) //1 and 2 
 
    .catch(e => console.error(e));

Çalışır şimdi.

+4

Yıkımı unuttum.Bunu yapmanın güzel bir yolu ve kabul edilen cevap olmayı hak ediyor. – spender

İlgili konular