数组函数内的异步/等待减少

时间:2017-04-14 14:51:19

标签: javascript arrays promise async-await reduce

我有一个带有reduce的数组上的简单异步函数的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])

1 个答案:

答案 0 :(得分:2)

当您调用返回promise的函数时,将执行promise中的代码:

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