ObjectIds不会添加到rankId数组

时间:2016-11-07 02:40:46

标签: node.js

我正在尝试在我的梯形图模型中添加一系列排名,然后在使用梯形图模型中创建的ObjectIds创建游戏对象之后,rankIds aray继续返回[],即使我在ladder.save log rank.id内,它返回objectId

代码

router.post('/:name/:ranks', function(req, res, next) {

  var rankIds = [];
  var params = req.params;
  var ranks = params.ranks.split(',');


  for (var i in ranks) {
    var ladder = new Ladder({
      name: ranks[i]

    });

    ladder.save(function(err, rank) {
      rankIds.push(rank.id);
    });
  }

  console.log(rankIds);

  var game = new Game({
    name: params.name,
    ranks: rankIds

  });

  game.save(function(err) {
    if (err) {
      res.send(err);
    } else {
      res.json({ message: 'Game created!' });
    }
  });


});

2 个答案:

答案 0 :(得分:0)

您正在执行for..in循环并调用db save asynchronous function。但是在异步操作完成之前执行console.loggame.save。你应该处理它。

此外,最好将for循环(或)foreach用于数组,而不是for..in

我修改了代码以确保在完成所有异步操作后执行console.loggame.save。我在这里使用vannilaJS而不是其他异步&保证模块,例如asyncbluebird等您应该考虑的事项。

但仍值得查看以下vannilaJS代码,该代码应该可以正常运行。

router.post('/:name/:ranks', function(req, res, next) {

  var rankIds = [];
  var errors = [];
  var params = req.params;
  var ranks = params.ranks.split(',');


  for (var i = 0; i < ranks.length; i++) {
    var ladder = new Ladder({
      name: ranks[i]    
    });

    ladder.save(function(err, rank) {
      if(err) {
         errors.push(err);
      } else {
         rankIds.push(rank.id); // Check: if it's a mongodb update then it could be '_id' instead of 'id'
      }

      saveGame();
    });
  }

  var saveGame = function() {
     if(rankIds.length + errors.length === ranks.length) {
        console.log(rankIds);

        var game = new Game({
           name: params.name,
           ranks: rankIds    
        });

        game.save(function(err) {
          if (err) {
            res.send(err);
          } else {
            res.json({ message: 'Game created!' });
          }
        });
     }    
  };
});

答案 1 :(得分:0)

考虑一下:

var arr = [];

var save = (callback) => {
  var id = "id";
  setTimeout(function () {
    callback(null, id);
  }, 2000);
}

for (var i = 0; i < 5; i++) {
  save(function (err, id) {
    arr.push(id);
  });
}

console.log(arr); // Print: []

setTimeout(function () {
  console.log(arr); // Print: [ 'id', 'id', 'id', 'id', 'id' ]
}, 10000);

save()函数需要几秒钟才能完成,因此第一个console.log(arr)将在for循环结束之前(或任何save()函数完成之前)运行。因此,arr仍为空。

但是在第二个console.log中,在该10秒后运行,它将打印出arr的值,其中包含5个值。

这在节点js中只是异步。