我正在尝试生成一个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,它是一个有几个属性的对象。这种情况下的主要成分是香料和配料。两者都是字符串列表。
- 我想检查RecipeData.spice:
- 如果列表中有一个元素:(该元素将是香料的名称)
- 我想在我的香料收藏中找到与该名称相关的香料,并将其_id永久添加到我的RecipeData.ingredients
- 如果列表中有一个元素:(该元素将是香料的名称)
在我用来测试这段代码的示例中,两个console.log都有相同的输出,而它们不应该有。
知道为什么变量RecipeData.ingredients在ForEach循环之外没有更改吗?
感谢您提前提供的帮助。
听起来像是一个异步编程问题。虽然您没有发布源代码,但我假设module.exports.findSpiceByName
是异步的,而forEach
不是,所以forEach
完成,第二个console.log
在findSpiceByName
调用有时间完成之前运行。
解决这个问题的一种方法是使用Promises,然后等待所有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);
});