【问题标题】:Javascript async in nested for loop MongoDB嵌套for循环MongoDB中的Javascript异步
【发布时间】:2014-04-28 01:52:41
【问题描述】:

我有一个嵌套在另一个 for 循环中的 for 循环内的异步函数。

// recipesArray is an array of arrays of objects
// recipeObject is an array of objects
// currentRecipe is an object

connectToDb(function(){
   // LOOP 1
   for (var i=0, l=recipesArray.length; i < l; i++) {
      // recipeObject is an 
      var recipeObject = recipesArray[i];

      // LOOP 2
      for (var x=0, y=recipeObject.length; x < y; x++) {
         var currentRecipe = recipeObject[x];

         // this is an asynchronous function
         checkRecipe(currentRecipe, function (theRecipe) {
            if (theRecipe === undefined) {
               console.log('RECIPE NOT FOUND');
            } else {
               console.log('RECIPE FOUND', theRecipe);
            }
         });
      }
   }
});

我需要根据 checkRecipe 函数的结果向 recipesArray 添加数据。

我一直在尝试不同的东西... - 我是否尝试跟踪 i 和 x... - 我是否尝试有多个回调... - 我什至需要做所有这些,还是有其他方法....

我也尝试使用 node 的异步库(实际上在其他情况下非常有帮助),但是 forEach 不接受对象(只有一个数组)。

卡住了。

任何建议将不胜感激。

【问题讨论】:

  • 你说forEach 只适用于数组,但你只有数组?或者至少recipesArrayrecipeObject 看起来都非常像数组。
  • 嗯,那些对象作为参数传递给你的回调函数?也许向我们展示您尝试过的代码。
  • 如果我将这样的内容传递给 async.forEach: [{ color: red, size: med }] 我将无法访问每个函数中的颜色和大小。
  • @Bergi,我认为这是我遇到的问题:github.com/caolan/async/issues/26
  • 尽量不要“编辑”原始对象,而是使用map 而不是each。是的,当您使用回调时,ix 会自动为您保留在闭包中。

标签: javascript node.js for-loop async.js


【解决方案1】:

假设checkRecipe() 可以无限制地并行运行,以下是您可以如何使用async.each()

connectToDb(function() {
  async.each(recipesArray, function(subArray, callback) {
    async.each(subArray, function(currentRecipe, callback2) {
      checkRecipe(currentRecipe, function(theRecipe) {
        if (theRecipe === undefined)
          return callback2(new Error('Recipe not found'));
        callback2();
      });
    }, callback);
  }, function(err) {
    if (err)
      return console.error('Error: ' + err);

    // success, all recipes found
  });
});

【讨论】:

  • 那么recipesArray 的(一个小例子)是什么样的?
  • [{ 颜色:红色,尺寸:中 },{ 颜色:绿色,尺寸:大 }]
  • 好的,那么你实际上并没有数组数组。你只有一个对象数组。我已经更新了我的答案以反映这一点。
  • 对不起,我说错了(错误的数组)。 recipesArray 看起来像 [ [ { key: value, key: value, key: value }, {key value..... }, {... } ], [{},{},{}] ]跨度>
  • 对象数组的数组
猜你喜欢
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
相关资源
最近更新 更多