承诺所有地图更新数组
我正在使用蓝鸟和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上看到这一点 。