асинхронный водопад возвращает единственную запись массива в узлах js и mongodb

0

Я создаю меню chield и parent category в nodejs и mongodb и angularjs. Я забочусь о том, что когда я возвращаю толкаемый массив с помощью обратного вызова, массив содержит только одну запись, хотя у меня есть много данных. Я не знаю, что такое гониг. вот мой код.

async.waterfall([
  function(cb) {
    //getting the parent category
    mealCatModel.find({
      parentId: ''
    }, {}, function(error, result) {
      if (error) {
        cb(error, null);
      } else {
        if (result) {
          //loop through the record
          result.forEach(function(key, value) {
            //find the chield category on behalf of parent id and key.id
            mealCatModel.find({
              parentId: key._id
            }, {}, function(err, subCat) {
              if (subCat) {
                subCat.forEach(function(k, v) {
                  if (k.parentId == key._id) {
                    // pushing all the record in a single array
                    mainJson.push({
                      mainCatId: key._id,
                      mainCatName: key.mealCatName,
                      subCatId: k._id,
                      subCatName: k.mealCatName
                    });
                    cb(null, mainJson);

                  }
                })
              }
            })
          })
        } else {
          cb('record not foound', null);
        }
      }

    });
  }
], function(error, mainJson) {
  ///return the err
  if (error) {
    res.json({
      type: false,
      data: 0
    });
  } else {
    // return the array to front end
    res.json({
      type: true,
      data: mainJson
    });
  }
});

Первая функция поиска получает основную категорию и зависит от этой записи, которую я прокручиваю в парах значений ключа, а затем я нашел key._id от имени этого я снова запускаю запрос на поиск, у которого есть родитель id основной категории. так что я получаю свою категорию прав, а затем нажимаю данные в массиве mainJson. но когда я возвращаю обратный вызов cb(), он возвращает только один массив.

Теги:
asynchronous

1 ответ

0

Обратный вызов выполняется в .forEach. Во время его выполнения цикл не завершил все свои итерации. Вы должны реорганизовать код для возврата обратного вызова после выражения .forEach:

if (subCat) {
  subCat.forEach(function(k, v) {
    if (k.parentId == key._id) {
      // pushing all the record in a single array
      mainJson.push({
        mainCatId: key._id,
        mainCatName: key.mealCatName,
        subCatId: k._id,
        subCatName: k.mealCatName
      });
    }
  });
  return cb(null, mainJson);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню