首页 > 解决方案 > 使用 Array.reduce() 从 fetch Promise 中提取 JSON 数据

问题描述

我正在编写一个then()语句,用于从fetch(). 下面的代码中queries是一系列对fetch(). 我正在使用 async/await 作为响应,否则将返回承诺而不解决(我在这个问题中找到了解决方案)。

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

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()为什么将承诺推入累加器会返回一个承诺而不是数组?我怎么能用 重构代码Array.reduce()

标签: javascriptarraysfetchasync.js

解决方案


尽管这不是您所要求的,但您可以避免不得不使用的痛苦reduce,而只需使用Promise.all()您已经在使用的:

return Promise.all(queries.map(q => q.then(res => res.json()))
  .then(data => {...})

这是一种更短的方式,当你重新阅读它时,阅读起来也不会那么令人头疼。


推荐阅读