[使用Array.reduce()从承诺中提取JSON数据

问题描述 投票:0回答:1

我正在编写then()语句,用于从fetch()的响应数组中提取json数据。在下面的代码中,queries是由对fetch()的一系列调用返回的promise数组。我正在使用async / await作为响应,因为否则,将不解决而返回承诺(我在this question中找到了一个解决方案)。

我的第一次尝试正常工作,当我推入jsonified时,我获得了一个以promises为元素的数组:

return Promise.all(queries)
.then(async(responses)=> {
    let jsonified = [];
    for (let res of responses){
        jsonified.push(await(res.json()));
    }
    return jsonified;
}.then(data=> ...

但是当我进行重构并尝试使用Array.reduce()时,我意识到,当我推入累加器而不是获得以promise作为元素的数组时,acc是分配为promise的代替

.then(responses=> {
    return responses.reduce(async(acc, next) => {
        acc.push(await(next.json()));
        return acc;
    }, [])
})

我可以使用第一个版本,没有任何问题,程序可以正常运行,但是Array.reduce()内部发生了什么? 为什么将promise推入累加器会返回数组的promise inadad?如何使用Array.reduce()重构代码?

javascript arrays fetch async.js
1个回答
0
投票

将累加器的初始值设为一个可解析为空数组的Promise,然后在每次迭代时await累加器(以便所有先前的迭代在当前迭代运行之前都得到解析)

.then(responses=> {
    return responses.reduce(async (accPromiseFromLastIter, next) => {
       const arr = await accPromiseFromLastIter;
       arr.push(await next.json());
       return arr;
    }, Promise.resolve([]))
})

(也就是说,您的原始代码要清晰得多,我更喜欢.reduce版本)

© www.soinside.com 2019 - 2024. All rights reserved.