如何使对象变量的更改保留在ForEach循环之后.Javascript



我正在尝试生成一个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.logfindSpiceByName调用有时间完成之前运行。

解决这个问题的一种方法是使用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);
});

最新更新