Javascript promise 链 hell

标签 javascript node.js

我遇到了一个我不知道如何解决的 promise 链问题。我的代码摘要:我对特定用户执行 mongoose 查询,获取他的 CarId,然后查询每辆车的详细信息并通过 JSON 响应返回这些详细信息。

let carsDetails = [];

  User.findById(userId)
    .then(user => {
      const carIds = user.carsDetails;
      carIds.forEach((carId) => {
        Car.findById(carId)
          .then(car => {
            console.log(car);
            carsDetails.push(car);     
          })
          .catch(err => { throw err; });
        });

      return res.status(200).json({ data: carsDetails });
    })
    .catch(error => {
      throw error;
    });

问题是在 carsDetails.push(car); 行中,实际上没有汽车被插入 carsDetails 数组,因为它在设法填满数组之前跳转到 return 语句。有没有一种解决方法可以执行这些查询并以数组、对象的形式返回结果……?我也尝试使用自制的 async forEach 语句以 async await 形式编写所有内容,但这对我没有帮助。有什么建议么?我已经尝试使用 Promise.all(),但未能解决问题。谢谢!

最佳答案

您需要收集您的 Car.findById(carId) 调用的 promise ,并使用 Promise.all() 等待所有调用,然后再响应。您可以使用 array.map() 将每个 ID 映射到来自 Car.findById() 的 promise 。

User.findById(userId)
  .then(user => {
    const carIds = user.carsDetails;
    const carPromises = carIds.map(carId => Car.findById(carId))
    return Promise.all(carPromises)
  })
  .then(cars => {
    res.status(200).json({ data: cars })
  })
  .catch(error => {
    throw error
  })

关于Javascript promise 链 hell ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57870855/

相关文章:

javascript - 缩放背景图像以适合 ie8 窗口

javascript - Laravel 使用 onchange 隐藏表单

node.js - 从 Node js 网站 url 中删除端口

javascript - 无法从对象数组中检索数据?

javascript - Jquery按钮点击检测

javascript - Angular 多次运行 Controller

javascript - 如何在 Javascript 中从 JSON 数组对象读取数据

node.js - 在 Heroku 中部署 Node.js 应用程序

node.js - 如何根据其他字段的值更改 Mongoose 模式中的标志?

node.js - 如何使用 AWS Rekognition 服务通过 Node.js 检测人脸