NodeJS - Bluebird:等待循环完成

时间:2016-03-27 00:37:09

标签: javascript node.js mongodb mongoose bluebird

解决什么应该是一件简单的事情。 我正在使用NodeJS和mongodb,并且还安装了Bluebird以使用promises。

我有一个简单的for循环,我创建了一堆随机名称,并将它们推送到数组中,如下所示:

const PlayerGenerator = () => {
   var playerArray = []
   for (var i = 0; i < 15; i++) {
      const player = new Player({
         name: 'Player' + Math.random() * 100
      })
      playerArray.push(player)
   }

   return playerArray

}

我想将所有这些名称写入我的数据库,但不能确定如何正确设置我的承诺,以便每个玩家都被写入我的数据库。

server.get('api/team/new', (req, res, next) => {
    const player = PlayerGenerator()
    // This array contains 15 players with the exact same name.
})

从我在这里看到的不同主题中看来,承诺似乎是解决这个问题的最好方法,但就像我上面提到的那样,不确定如何设置它并且正在寻找一些建议。

1 个答案:

答案 0 :(得分:1)

我真的认为你是以错误的方式解决这个问题,因为它们似乎是一种更为简单和合乎逻辑的方法来解决你似乎正在寻找的问题。

你真正想做的就是&#34;在数据库中创建15个随机命名的玩家&#34; ,并避开更好的方法来获得独特的随机名称(因为当前的方法不是&#39) ; t&#34;唯一&#34;随机),您真正需要做的就是将一组普通对象直接传递给Player.create(),因为您的历史记录表明您正在使用猫鼬:

Player.create(
  Array.apply(null,Array(15)).map(() => {
    return { "name": "Player" + Math.floor(Math.random() * 100) }
  })
).then((players) => {
  console.log(players)
});

这会给你输出类似的东西:

[ { _id: 56f7488242727e6c308f79eb, name: 'Player87', __v: 0 },
  { _id: 56f7488242727e6c308f79ec, name: 'Player29', __v: 0 },
  { _id: 56f7488242727e6c308f79ed, name: 'Player81', __v: 0 },
  { _id: 56f7488242727e6c308f79ee, name: 'Player52', __v: 0 },
  { _id: 56f7488242727e6c308f79ef, name: 'Player12', __v: 0 },
  { _id: 56f7488242727e6c308f79f0, name: 'Player93', __v: 0 },
  { _id: 56f7488242727e6c308f79f1, name: 'Player69', __v: 0 },
  { _id: 56f7488242727e6c308f79f2, name: 'Player88', __v: 0 },
  { _id: 56f7488242727e6c308f79f3, name: 'Player81', __v: 0 },
  { _id: 56f7488242727e6c308f79f4, name: 'Player48', __v: 0 },
  { _id: 56f7488242727e6c308f79f5, name: 'Player38', __v: 0 },
  { _id: 56f7488242727e6c308f79f6, name: 'Player82', __v: 0 },
  { _id: 56f7488242727e6c308f79f7, name: 'Player47', __v: 0 },
  { _id: 56f7488242727e6c308f79f8, name: 'Player85', __v: 0 },
  { _id: 56f7488242727e6c308f79f9, name: 'Player26', __v: 0 } ]

这似乎最有意义,因为它实际上只是对数据库的一次调用,因为MongoDB允许您指定多个文档插入到单个语句中。

当然,如果您只想使用promise promise,那么只需使用Promise.all(),这也不需要在这里包含Bluebird,特别是如果您已经使用ES6构造运行。

只需从.create()返回Promise,然后稍后解决:

  var playerPromises = Array.apply(null,Array(15)).map(() => {
    return Player.create({ "name": "Player" + Math.floor(Math.random() * 100) });
  });

  Promise.all(playerPromises).then((players) => {
      console.log(players);
  });

因此,在这种情况下,您只使用Promise返回的.create()并将每个{1}}解析为生成的数组。但它当然实际上是写入数据库&#34;十五次&#34; ,当你本可以发送&#34;一个&#34; 请求时

对于我的两分钱,只需提供一系列您想直接创建的内容.create()。虽然有一些用于解决一系列承诺的用例,但实际上这并不是最佳解决方案。