异步减少退货承诺

2022-05-24 00:00:00 node.js reduce javascript ecmascript-6

我有一个对象数组,我必须为来自和异步函数的每个对象添加一个属性

我正在执行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;
      }, []);

但我收到消息

推流不是用户的功能

这是因为我认为这是一个承诺。

如何在reducemap

中处理异步请求

解决方案

是的,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 };
}));

相关文章