【问题标题】:Promise all map update array承诺所有地图更新数组
【发布时间】:2017-07-13 06:14:25
【问题描述】:

我正在使用 bluebird 和 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 属性。我尝试了不同的方法,但没有成功。

【问题讨论】:

  • 为什么不直接使用users[index].hasCar = ...,而不是user.hasCar = ...
  • 为什么不直接使用if (car) { … = true; } else { … = false; } 而不是… = Boolean(car);
  • 嘿,谢谢菲尔的回答,我之前也试过这种方式,return userelse 之后也试过,不行,我还是老用户。
  • 数组不想更新”到底是什么意思?你如何测试阵列的更新?请向我们展示不起作用的代码,而不仅仅是您怀疑是问题的代码。可以肯定的是,您只是没有在等待更新。
  • 你的意思是数据库没有更新?

标签: javascript arrays node.js mongoose bluebird


【解决方案1】:

找到了问题所在,您似乎无法添加我的猫鼬模型User 中不存在的属性。为了绕过它,我做了:

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

谢谢大家

【讨论】:

【解决方案2】:

它似乎按原样工作。我做了一些简单的更改来伪造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 上看到这一点。

【讨论】:

  • 非常感谢 Scott 抽出宝贵时间,这让我发疯了,我终于找到了罪魁祸首,是我的猫鼬,我编辑了我的帖子。
  • @John:很高兴你找到了它。你是在这里做了类似我的测试还是通过调试器运行它?
猜你喜欢
  • 2018-05-11
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多