【问题标题】:Async/Await inside Array function reduceArray 函数中的 Async/Await 减少
【发布时间】:2017-09-10 20:32:23
【问题描述】:

我有 2 个代码 sn-ps (Parallel,Sequential) 在一个带有 reduce 的数组上执行一个简单的异步函数。我不明白,为什么直到我调用 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])

【问题讨论】:

  • 只是想补充一点,当我不使用调试时,第二次顺序执行将在不调用 Promise.all() 的情况下工作。也许这与我的 IDE 和 mocha 而不是 javascript 有关。

标签: javascript arrays promise async-await reduce


【解决方案1】:

当你调用返回 promise 的函数时,promise 中的代码会被执行:

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

但它返回的是一个承诺而不是一个值。您将需要处理 promise 以获得它解析的值。

你不需要使用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));

【讨论】:

  • Alberto,我会将您的答案标记为正确,因为这解决了我发布的问题。实际上,我必须在 reduce 中使用 concat,因为我可能需要插入多个数组元素来代替数组的单个成员。与此同时,我刚刚意识到,当我调试 setTimeout 函数时,网络会以某种方式被触发,这就是为什么我在调用 Promise.all 之前没有在屏幕上看到结果的原因。所以我实际上不需要调用 promise.all 来获得结果。
猜你喜欢
  • 2021-08-06
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
  • 2023-03-26
  • 2018-09-01
相关资源
最近更新 更多