2016-08-23 4 views
0

Я создал код в node.js, в котором используется mongoDB. Все работает нормально, но когда я использую вложенный цикл, он прерывается и не возвращает правильные значения.Как использовать async в node.js

DB1.find({},function(error,fetchAllDB1) { 
    var mainArray = new Array(); 
    for (var i in fetchAllDB1) { 
     if(fetchAllDB1[i].name) { 
      var array1 = new Array(); 
      var array2 = new Array(); 

      array1['name'] = fetchAllDB1[i].name; 
      array1['logo'] = fetchAllDB1[i].logo; 
      array1['desc'] = fetchAllDB1[i].desc;  

      DB2.find({is_featured:'1', brand_id: fetchAllDB1[i]._id}, function(error,fetchDB2) { 
       for (var p in fetchDB2) { 
        var pArr=[]; 
        pArr['_id'] = fetchDB2[p]._id; 
        pArr['name'] = fetchDB2[p].name; 
        pArr['sku'] = fetchDB2[p].sku; 
        pArr['description'] = fetchDB2[p].description; 

        console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>'); 
        console.log(pArr); 
        console.log('<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'); 
        array2[p]=pArr; 
       } 
       array1['pp']= array2; 
      }); 
      mainArray[i]=array1; 
     } 
    } 
    console.log('######### LAST #########'); 
    console.log(mainArray); 
    console.log('######### LAST #########'); 
}); 

В моей консоли сообщение его показ

console.log('######### LAST #########'); 

    All Values 

    console.log('######### LAST #########'); 

После этого

console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>'); 
All Values; 
console.log('<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'); 

Я хочу использовать асинхр в моем коде, так что все выборки данных происходит, как показано ниже:

mainarray = 
[ 
    [array1] = All Values 
    [array2] = [0] 
       [1] 
] 

mainarray = 
[ 
    [array1] = All Values 
    [array2] = [0] 
       [1] 
] 
+0

Как ваш код даже работать? Я имею в виду 'for (var i in fetchAllDB1)' '' i' должен быть объектом, но вы используете его как целое число? – sed

+0

добавление комментария @Stan, что такое DB2? сбор или фактический db? Если это БД, о чем вы запрашиваете? Я не вижу в документах, что у db есть метод find ... –

+0

В любом случае, вы ищете эту библиотеку, там вы можете делать асинхронные действия в циклах. https://caolan.github.io/async/ – sed

ответ

-1

Ваш код очень запутанным и чрезмерно сложным.

Что вы должны сделать, это (псевдо-код):

DB1.find(foo) // returns one result 
    .then(getFromDB2); 

function getFromDB2 (res){ 
    return DB2.find(res); // make a query here with mongo drivers `$in` 
} 

Mongodb : $in operator vs lot of single queries