我遇到了一个我不知道如何解决的 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/