首页 > 解决方案 > 在 Promise.all() 中处理来自每个承诺的响应对象

问题描述

我有一个 post 端点,它创建客户并返回 userId 作为响应

例如

// Post Data
const customers = [{
    firstName: 'John',
    lastName: 'Smith',
    userId: '12345
  },
  {
    firstName: 'Phil',
    lastName: 'Doe',
  },
  {
    firstName: 'Dan',
    lastName: 'Joe',
  }
]


app.post('/customers', (req, res) => {
  const arrayPromises = []
  const customers = req.body.customers;
  customers.forEach((customer) => {
    //checking whether I have a userId already
    if (!customer.userId) {
      const postRequest = {
        headers: Object.assign(res._headers, {
          Accept: 'application/json',
          'Content-Type': 'application/json',
        }),
        post:'www.createUserExample.com,
        customer // post data,
      };
      arrayPromises.push(axios(postRequest))
      //response will be {userId}
    }
  })


  Promise.all(arrayPromises).then(result => {
    //by this way I get all userids
    res.status(200).json(result.data)
  })


})

但我需要发送一个包含 userIds 的响应对象

示例响应对象应该像

[{
    firstName: 'John',
    lastName: 'Smith',
    userId: '12345'
  },
  {
    firstName: 'Phil',
    lastName: 'Doe',
    userId: '65765'
  },
  {
    firstName: 'Dan',
    lastName: 'Joe',
    userId: '786876'
  }
]

因此,总的来说,我希望拥有客户的属性并将创建的 userId 附加到发布数据对象并作为响应发送。

请让我知道最好的方法。我喜欢做异步请求来创建客户

标签: javascriptnode.jsreactjses6-promise

解决方案


只需将已经具有 id 的对象推送到数组中。(或对他们的承诺)。Promise.all然后将导致您正在寻找的数组。该数组不一定只需要包含 API 请求的承诺:

const arrayPromises = []
const customers = req.body.customers;
customers.forEach((customer) => {
  //checking whether I have a userId already
  if (customer.userId) {
    arrayPromises.push(Promise.resolve(customer));
  } else {
    arrayPromises.push(axios(…));
  }
});

您还可以简化为

const arrayPromises = req.body.customers.map((customer) => {
  //checking whether I have a userId already
  return customer.userId
    ? Promise.resolve(customer)
    : axios(…);
});

推荐阅读