我需要通过向其添加User对象来编辑Game对象。这是通过mongoose查询findById完成的。此查询有效。但是,当我想将修改过的游戏添加到生成的数组时,出现问题。 'console.log(游戏);'返回正确的输出,但'console.log(result);'总是空的。出了什么问题?它是否具有内在功能?
var result = [];
games.forEach(function(game){
User.findById(game.user1_id, function(err, user){
if(err)
console.log(err);
game.user1 = user;
result.push(game);
console.log(game);
});
});
console.log(result);
答案 0 :(得分:0)
您遇到了类回调问题。当您在游戏上调用forEach
时,代码实际上会在回调之外继续,因此结果将是您首次分配给它的值,即[]
。这是因为代码被异步评估。
通过将代码移动到具有在循环完成时调用的回调的函数来解决此问题,如下所示:
var utils = require('restberry-utils');
var getResult = function(next) {
var result = [];
utils.forEachAndDone(games, function(game, iter) {
User.findById(game.user1_id, function(err, user) {
if (err) console.log(err);
game.user1 = user;
result.push(game);
iter();
});
}, function() {
next(result);
});
};
getResult(function(result) {
console.log(result);
});
注意我已导入restberry-utils
包并使用了forEachAndDone
方法。此方法将遍历对象,但除非您调用iter
方法,否则不会继续。当它循环遍历所有对象时,将调用最后一个回调,这是我返回结果的地方。
希望这是有道理的。