承诺所有地图更新数组

我正在使用蓝鸟和mongoose,我得到了一个前一个函数的用户数组。 我想更新users设置属性hasCar true或false从我的数组中的每个用户。

 function findCars(users) { return Promise.all(users.map((user) => { return Car.count({ _creator: new ObjectId(req.user), userId: user._id }) .then((car) => { user.hasCar = !!car; return user; }); })) .then(console.log); } 

问题是,在console.log中,这些用户没有设置hasCar属性。 我尝试了不同的方式,但没有成功。

发现什么是错的,似乎你不能添加一个属性,在我的mongoose模型User不存在。 为了绕过它,我做了:

 let updatedUser = user.toObject(); updatedUser.hasCar = !!car; return updatedUser; 

感谢大家

它似乎工作,因为它是。 我做了一些简单的修改,以伪造Car.count并删除了ObjectId ,并且按预期工作:

 const cars = {1: ['car a', 'car b'], 3: ['car c']}; const Car = { count: (user) => new Promise((resolve, reject) => setTimeout(() => resolve(cars[user.userId]), 1000)) }; function findCars(users) { return Promise.all(users.map((user) => Car.count({ userId: user._id }) .then((car) => { user.hasCar = !!car; return user; }) )) .then(console.log); } const users = [{_id: 1}, {_id: 2}, {_id: 3}]; findCars(users); 

这将返回一个Promise,并在一秒钟之后将以下内容logging到控制台:

 [{"_id":1,"hasCar":true},{"_id":2,"hasCar":false},{"_id":3,"hasCar":true}] 

请注意,我原本使用更简单

 count: (user) => Promise.resolve(cars[user.userId]) 

但我想确保一些真正的asynchronous。 这两种方式都没有任何问题。

您可以在RunKit上看到这一点