2017-04-14 68 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