javascript - 使用 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()
?
解决方案
尽管这不是您所要求的,但您可以避免不得不使用的痛苦reduce
,而只需使用Promise.all()
您已经在使用的:
return Promise.all(queries.map(q => q.then(res => res.json()))
.then(data => {...})
这是一种更短的方式,当你重新阅读它时,阅读起来也不会那么令人头疼。
推荐阅读
- laravel - 我是否必须在 AWS ec2 实例上为 laravel 应用程序安装和设置防火墙?
- python - Django 查询设置无类型变量
- javascript - 改变/更新对象数组,同时解构不改变数组的对象属性
- jsonata - 将键与兄弟对象 JSONATA 匹配
- python - 运行带有共享对象文件的库 Django
- android - Android NDK OpenGL ES 3.0 glDrawArrays 和 glDrawElements 抛出 GL_INVALID_OPERATION
- python - Tkinter 读取子进程输出并将其放入 gui
- pyspark - Pyspark:基于动态 5 分钟间隔对记录进行分组
- java - 删除 BST 中范围之间的叶节点
- c++ - 如何使用 OpenMP 以正确的方式并行化这个数组?