2017-04-14 52 views
2

我有2個代碼片段(並行,順序)執行一個簡單的異步功能與減少數組。我不明白,爲什麼直到我打電話給Promise.all纔開始執行。這是做這件事的最好方法嗎?異步/等待內部陣列功能減少

// Function returning promise with root value 
async function proot(x) { 
    return new Promise((res,rej)=>{ 
     setTimeout(() => { 
      console.log(x*x); 
      res(x*x) 
     },1000)  
    }) 
} 

// Parallel Execution 
var arr1 = [2,3,4].reduce((prev,next)=>{ 
    return prev.concat(proot(next)) 
},[]) 
arr1 = await Promise.all(arr1) 

// Sequential Execution 
var arr2 = [2,3,4].reduce(async (prev,next)=>{ 
    return (await prev).concat(await proot(next)) 
},Promise.resolve([])) 
arr2 = await Promise.all([arr2]) 
+0

只是想補充的是,第二順序執行將不調用Promise.all工作()的時候,不使用調試。也許這與我的IDE和摩卡有關,而不是JavaScript。 – ucipass

回答

1

承諾中的代碼,當你調用返回的承諾的功能被執行:

// Parallel Execution 
var arr1 = [2,3,4].reduce((prev,next)=>{ 
    return prev.concat(proot(next)) 
},[]) 

但它返回一個承諾,而不是一個值。您需要處理承諾,以獲得其解決的價值。

您不需要使用reduce。地圖會在你的情況下工作:

var arr = [2,3,4].map((n) => proot(n)); 
Promise.all(arr).then((values) => {}) 

或者:

var arr = [2,3,4].map(async (n) => await proot(n)); 
+1

阿爾貝託,我會標記你的答案是正確的,因爲這解決了我發佈的問題。我實際上必須使用reduce中的concat,因爲我可能需要插入多個數組元素來代替我的數組中的單個成員。在此期間,我剛剛意識到,雖然我在調試setTimeout函數時會觸發網絡,這就是爲什麼直到我調用Promise.all時纔在屏幕上顯示結果的原因。所以我其實不需要打電話給promise.all來獲得結果。 – ucipass