Javascript 承诺所有地图更新数组
我使用的是蓝鸟和猫鼬,我在前面的函数中得到了一组用户。我想更新Javascript 承诺所有地图更新数组,javascript,arrays,node.js,mongoose,bluebird,Javascript,Arrays,Node.js,Mongoose,Bluebird,我使用的是蓝鸟和猫鼬,我在前面的函数中得到了一组用户。我想更新users,为数组中的每个用户设置属性hasCartrue或false function findCars(users) { return Promise.all(users.map((user) => { return Car.count({ _creator: new ObjectId(req.user), userId: user._id }) .then((car) =
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
。我尝试了不同的方法,但没有成功。它似乎是这样的。我做了一些简单的更改来伪造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);
这将返回一个承诺,一秒钟后将以下内容记录到控制台:
[{"_id":1,"hasCar":true},{"_id":2,"hasCar":false},{"_id":3,"hasCar":true}]
注意,我最初使用的是更简单的
count: (user) => Promise.resolve(cars[user.userId])
但我想确保一些真正的异步。两种方式都没有任何问题
您可以在上看到这一点。如果发现问题所在,您似乎无法添加在我的mongoose模型
用户
中不存在的属性。为了绕过它,我做了:
let updatedUser = user.toObject();
updatedUser.hasCar = !!car;
return updatedUser;
谢谢大家而不是
users[index].hasCar=…
,为什么不简单地使用user.hasCar=…
?而不是if(car){…=true;}否则{…=false;}
为什么不简单地使用..=Boolean(car)
?嘿,谢谢Phil的回答,我以前也尝试过这种方法,而且返回用户
在else
之后,不起作用,我仍然得到了老用户。“数组不想更新”到底是什么意思?如何测试阵列的更新?请向我们展示不起作用的代码,而不仅仅是您怀疑是问题所在的代码。你肯定不是在等更新。你的意思是数据库没有更新?非常感谢斯科特的时间,这让我抓狂,我终于找到了罪魁祸首,是我的猫鼬,我编辑了我的帖子。@John:很高兴你找到了它。您是在这里执行类似于我的测试还是通过调试器运行它?我们可以使用lean()和Mongoose查询来修改结果