2016-07-30 171 views
-1

我正在尝试生成一个Data对象,我可以使用它在NodeJS中使用猫鼬在我的MongoDB数据库中创建新文档。如何在ForEach循环后保留对象变量更改。 Javascript

这是代码的片段:

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循环之外没有改变?

感谢您提前提供任何帮助。

回答

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); 
}); 
+0

,实际上是千真万确的。这些'console.logs'运行在'findSpiceByName'之前。我怎样才能解决这个问题?虽然无论控制台日志,我敢肯定,变量并没有改变,因为我尝试了数据对象后添加到收藏的地方需要没有更新。 – Nedaaa

+0

更新我的答案用的,因为同样的事情发生了保持你如何能得到解决此问题 –

+0

这didnt相当帮助的例子。所以为了避免这个问题,我在集合已经在数据库中后改变了数据。这样,我可以在发生变化时直接更新数据库。尽管感谢您的帮助。 :) – Nedaaa