2016-02-09 5 views
9

Standardmäßig die Promise.All ([]) -Funktion gibt eine Anzahl-basierte Index-Array, das die Ergebnisse der einzelnen Versprechen enthält.Beste es6 Weg, Namen basierte Ergebnisse mit Promise.all

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

Was ist der beste Weg, um einen Vanille benannten Index der Ergebnisse mit Promise.all zurückzukehren()?

habe ich versucht, mit einer Karte, aber es gibt Ergebnisse in einem Array auf diese Weise: [key1, value1, key2, value2]

UPDATE:

Meine Fragen scheint unklar, hier ist, warum ich nicht mag bestellt basierender Index:

  1. es ist beschissen zu halten: wenn Sie hinzufügen Ein Versprechen in Ihrem Code müssen Sie möglicherweise die gesamte Ergebnisfunktion neu schreiben, da der Index möglicherweise geändert haben.
  2. es ist schrecklich zu lesen: results[42] (kann unten mit Auslegern Antwort festgelegt werden)
  3. Nicht wirklich brauchbar in einem dynamischen Kontext:
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

Ich glaube nicht, dass Sie können oder sollten? Mit "named" nehme ich an, du meinst ein Objekt mit Schlüsseln und Werten, und was wären diese Schlüssel und was erwartest du zu bekommen? – adeneo

+0

Viele Bibliotheken wie RSVP implementieren eine Hash-Methode. Möglicherweise benötigen Sie ein anderes Array wie ['myFuncAsync1', 'myFuncAsync2']. Und dann kartieren Sie die Ergebnisse wie Promise.all (verspricht) .then ((results) => { var temp = {}; results.forEach ((Ergebnis, Index) => { temp [VersprechungenNamen [Index]] = Ergebnis; }); Rücklauftemp; } .then (Ergebnis => {}) – blessenm

+1

Schade, es ist nicht wie jQuery, in denen verspricht können Sie $ .when (deffered1, deffered2) DONE (function (result1 tun , result2) {...}) – phenxd

Antwort

5

Ist dies die Art der Sache?

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 unterstützt Destrukturierung, wenn Sie also nur die Ergebnisse nennen wollen, können Sie schreiben:

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));

Arbeiten in Firefox und Chrome jetzt.

+4

Ich habe die Destrukturierung vergessen.Dies ist der raffinierte Weg, dies zu tun und verdient es, die akzeptierte Antwort zu sein. – spender

Verwandte Themen