如何在ForEach循环后保留对象变量。使用Javascript

时间:2016-07-30 01:02:38

标签: javascript arrays node.js object mongoose

我正在尝试生成一个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:
    • 如果列表中有元素:(元素将是spice的名称)
      • 我想在我的Spices Collection中找到与该名称相关的香料,并将其_id永久添加到我的RecipeData.ingredients

在我用来测试此代码的示例中,console.log并不具有相同的输出。

知道为什么变量RecipeData.ingredients没有在ForEach循环之外改变吗?

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

1 个答案:

答案 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);
});