我正在尝试在我的梯形图模型中添加一系列排名,然后在使用梯形图模型中创建的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!' });
}
});
});
答案 0 :(得分:0)
您正在执行for..in
循环并调用db save asynchronous function。但是在异步操作完成之前执行console.log
和game.save
。你应该处理它。
此外,最好将for
循环(或)foreach
用于数组,而不是for..in
。
我修改了代码以确保在完成所有异步操作后执行console.log
和game.save
。我在这里使用vannilaJS
而不是其他异步&保证模块,例如async,bluebird等您应该考虑的事项。
但仍值得查看以下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中只是异步。