异步减少返回承诺

Rub*_*edo 2 javascript reduce node.js ecmascript-6

我有一组对象,我必须在来自 async 函数的每个对象上添加一个属性

我正在做一个 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;
      }, []);
Run Code Online (Sandbox Code Playgroud)

但我收到消息

推送不是用户的功能

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

我如何处理 areduce或 a 中的异步请求map

Ber*_*rgi 6

是的,users是一个承诺。不要函数一起使用reduceasync。你可以await users在第一行做一些类似的事情,但这会非常低效和单调。

使用普通循环:

const users = [];
for (const user of resultOne) {
    const { name } = await names.getNames(user.id);
    delete user.id;
    users.push({ ...user, userName: user });
}
Run Code Online (Sandbox Code Playgroud)

或者,在您可以同时执行所有操作并创建数组的情况下,该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 };
}));
Run Code Online (Sandbox Code Playgroud)