我正在编写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()
重构代码?
将累加器的初始值设为一个可解析为空数组的Promise,然后在每次迭代时await
累加器(以便所有先前的迭代在当前迭代运行之前都得到解析)
.then(responses=> {
return responses.reduce(async (accPromiseFromLastIter, next) => {
const arr = await accPromiseFromLastIter;
arr.push(await next.json());
return arr;
}, Promise.resolve([]))
})
(也就是说,您的原始代码要清晰得多,我更喜欢.reduce
版本)