2016-02-09 15 views
9

默認情況下,Promise.All([])函數返回一個基於數字的索引數組,其中包含每個承諾的結果。最好的es6方法,以Promise.all獲取基於名稱的結果

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

什麼是最好的方式香草返回的結果與Promise.all命名指數()?

我試圖用一個地圖,但它以數組形式返回的結果是這樣的: [key1, value1, key2, value2]

UPDATE:

我的問題,似乎都不清楚,這是爲什麼我不喜歡訂購基於指數:

  1. 這是蹩腳保持:如果添加在你的代碼中承諾你可能不得不重寫整個結果函數,因爲索引可能有變化。
  2. 這太可怕了閱讀results[42](可以是固定下面臂架的答案)
  3. 在動力方面不是真的有用:
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

我不認爲你可以或應該?通過「命名」,我假定你的意思是一個帶有鍵和值的對象,這些鍵是什麼,以及你期望得到什麼? – adeneo

+0

許多類似RSVP的庫都實現了散列方法。您可能需要另一個數組,如['myFuncAsync1','myFuncAsync2']。然後映射結果如Promise.all(承諾)。然後((結果)=>){var} = results.forEach((result,index)=> { = result; }); return temp; } .then(result => {}) – blessenm

+1

太糟糕了,它不像你可以做的jQuery承諾 $ .when(deffered1,deffered2).done(function(result1 ,result2){...}) – phenxd

回答

5

這是怎樣的事情?

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支持解構,所以如果你只是想說出結果,你可以寫:

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

在Firefox和Chrome現在。

+4

我忘了解構。這是做這件事的好辦法,值得被接受的答案。 – spender