嵌套for循环MongoDB中的Javascript异步

时间:2014-04-28 01:52:42

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

我在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 ...... - 我尝试多次回调...... - 我甚至需要做所有这些,还是有其他方式......

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

卡住。

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:2)

假设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
  });
});