异步减少退货承诺
我有一个对象数组,我必须为来自和异步函数的每个对象添加一个属性
我正在执行Array.Reduce以迭代每个元素并仅返回一个结果:具有新属性的一个对象数组。
我有这个
const res = await resultOne.reduce(async (users = [], user, i) => {
let userName;
try {
let { name } = await names.getNames(user.id);
userName = name;
} catch (error) {
throw error;
}
delete user.id;
users.push({ ...user, userName });
return users;
}, []);
但我收到消息
推流不是用户的功能
这是因为我认为这是一个承诺。
如何在reduce
或map
解决方案
是的,users
是承诺。不要use reduce
with async
functions。您可以在第一行中执行类似await users
的操作,但这将非常低效且单调。
使用普通循环:
const users = [];
for (const user of resultOne) {
const { name } = await names.getNames(user.id);
delete user.id;
users.push({ ...user, userName: user });
}
或者,在您可以同时执行所有操作并创建数组的情况下,map
函数与Promise.all
:
const users = await Promise.all(resultOne.map(async user => {
const { name } = await names.getNames(user.id);
delete user.id;
return { ...user, userName: user };
}));
相关文章