我正在尝试生成一个Data对象,我可以使用它在NodeJS中使用mongoose在我的MongoDB数据库中创建新文档。
这是代码片段:
console.log(RecipeData.ingredients);
RecipeData.spices.forEach(function(spice){
module.exports.findSpiceByName(spice, function(err, res){
if (err){
return callback(err);
}
RecipeData.ingredients.push(res._id);
return callback(null, RecipeData);
});
});
console.log(RecipeData.ingredients);
基本上,我有RecipeData,它是一个具有一些属性的对象。在这种情况下,主要的是香料和成分。这两个都是字符串列表。
在我用来测试此代码的示例中,console.log并不具有相同的输出。
知道为什么变量RecipeData.ingredients没有在ForEach循环之外改变吗?
感谢您提前提供任何帮助。
答案 0 :(得分:0)
听起来像是异步编程问题。虽然你没有发布消息来源,但我假设module.exports.findSpiceByName
是异步的,forEach
不是,forEach
完成,你的第二个console.log
在您的findSpiceByName
来电有时间完成之前运行。
解决此问题的一种方法是使用Promises,然后在尝试检查成分之前等待所有这些完成:
var spicePromises = RecipeData.spices.map(function(spice) {
return new Promise(function(resolve, reject) {
module.exports.findSpiceByName(spice, function(err, res) {
if (err) {
return reject(err);
}
resolve(res._id);
});
});
});
Promise.all(spicePromises).then(function(ingredients) {
Recipe.ingredients = ingredients;
console.log(RecipeData.ingredients);
});