承诺所有地图更新阵列

时间:2017-02-22 23:32:59

标签: javascript arrays node.js mongoose bluebird

我使用蓝鸟和猫鼬,我在之前的功能中获得了一组用户。我想更新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。我尝试了不同的方法但没有成功。

2 个答案:

答案 0 :(得分:1)

发现错误,似乎你无法添加我的猫鼬模型User中不存在的属性。绕过它我做了:

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

谢谢大家

答案 1 :(得分:0)

似乎工作原样。我做了一些简单的更改来伪造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,稍后一秒将以下内容记录到控制台:

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

注意,我最初使用的是更简单的

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

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

您可以在 RunKit 上看到这一点。