【发布时间】:2020-09-03 07:17:48
【问题描述】:
我有大量对象,并根据用户 ID 过滤了对象。这是下面的代码。
const filteredArr = LargeArr.Items.reduce(
async(acc, { attributes: { dob, name, picture} = { dob: null, name: null, picture: null }, userID }) => {
let pic = null;
if (picture) { pic = await getPic(picture); } // async here
acc[userID] = { name, userID, pic, dob };
return acc;
}, {});
预期输出:
{
'1595232114269': {
name: 'Mark Status',
userID: '1595232114269',
picture: 'mark-status.jpg',
dob: '2020-08-10'
},
'48e69555d778f9b9a3a1d553b9c3b8f7dd6a3394ac82df1433b60a69c055d23d': {
name: 'Jack Thomas',
userID: '48e69555d778f9b9a3a1d553b9c3b8f7dd6a3394ac82df1433b60a69c055d23d',
picture: 'jack-thomas.jpg',
dob: '1990-12-20'
},
'48e69555d778f9b9a3a1d553b9c3b8f7dd6a3394ac82df1433b60a69c055d47p': {
name: 'Petro Huge',
userID: '48e69555d778f9b9a3a1d553b9c3b8f7dd6a3394ac82df1433b60a69c055d47p',
picture: 'petro huge.jpg',
dob: '1856-12-20'
},
'48e69555d778f9b9a3a1d553b9c3b8f7dd6a3394ac82df1433b60a69c055d55j': {
name: 'Mark Henry',
userID: '48e69555d778f9b9a3a1d553b9c3b8f7dd6a3394ac82df1433b60a69c055d55j',
picture: 'mark-henry.jpg',
dob: '2005-12-29'
}
}
我需要从一个异步的 api 中获取图片,所以在 reduce 方法中使用了 async await。这里的问题是它总是显示为 Promise pending。如果这是一个对象数组,那么我可以返回 Promise.all,但由于这是包含对象的对象,我如何在 reduce 方法中继续执行此操作?我需要完全相同的预期输出。
有人可以帮我解决这个问题吗?任何帮助将不胜感激。
【问题讨论】:
-
acc将在第一次迭代后成为一个承诺(因为async函数返回一个承诺)。 -
为什么变量名
filteredArr的内容是对象?顾名思义,它存储Array.prototype.filter()调用的结果。 -
@FelixKling 是的,你能告诉我我们该怎么做吗?
-
您可以先使用 Promise.all() 进行所有必要的 API 调用,然后使用
.reduce并传递同步函数。 -
只是不要在这里使用
reduce:) 它使事情变得不必要地复杂。
标签: javascript node.js ecmascript-6 async-await