2016-05-21 4 views
0

Я пытаюсь использовать async.each функцию, чтобы получить массив с моими результатами из двух запросов. После этого мне нужно отобразить эти результаты на веб-странице.Почему не работает правильно async.each nodejs?

Функция async.each исчисляет переменную, которая получается правильно, но я не могу экспортировать эту переменную за пределы функции и визуализировать ее, и я не понимаю, почему.

Здесь я прикрепил код, где я его протестировал. Я понял, что когда я вызываю «callback1», функция (ошибка) не работает, и я не получаю список переменных в консоли (так что я не смогу впоследствии ее обработать). Пожалуйста, я был бы признателен, если бы кто-нибудь мог мне помочь в этом. Большое спасибо.

var list = []; 

    async.each(data, 
    function(elem, callback1){ 
     var classgene = ''; 
     var custom_gene = {}; 
     custom_gene = {Name_Gene: elem['Name_Gene']}; 

     if (elem['Type_Gene'] == "reference") { 
      async.waterfall([ 
      function(callback2){ 
       var id = elem['Id_Genes']; 
       geneModel.getGenesRefClass(id, function(error, data2){ 
        classgene = data2[0]['Class_Name']; 
        custom_gene['classgene'] = classgene; 
        callback2(custom_gene); 
       }); 
      }, 
      ], function(custom_gene, err){ 
       list.push(custom_gene); 
       console.log(list); 
       callback1(); 
      }); 
     } 
    }, function(err){ 
     // if any of the saves produced an error, err would equal that error 
     if(err){ 
      console.log(list); 
     }else{ 
      console.log(list); 
     } 
    }); 

ответ

1

Ваш код имеет несколько проблем:

  • Это не призывающие callback2() должным образом. Он должен быть callback2(null, custom_gene) (первый аргумент зарезервирован для ошибок, или null, если таковых нет). Предпочтительно, вы также должны проверить на error, возвращаемый geneModel.getGenesRefClass();
  • Предыдущий выпуск также означает, что вам необходимо поменять аргумент function(custom_gene, err) (он должен стать function(err, custom_gene));
  • Когда elem['Type_Gene'] не равно "reference", вы все равно должны звонить callback1(), в противном случае async.each() не знает, что код выполнен;

Так что код стал бы что-то вроде этого:

var list = []; 

async.each(data, function(elem, callback1) { 
    var classgene = ''; 
    var custom_gene = { Name_Gene : elem['Name_Gene'] }; 

    if (elem['Type_Gene'] == "reference") { 
    async.waterfall([ 
     function(callback2) { 
     var id = elem['Id_Genes']; 
     geneModel.getGenesRefClass(id, function(error, data2){ 
      if (error) return callback2(error); 
      classgene = data2[0]['Class_Name']; 
      custom_gene['classgene'] = classgene; 
      callback2(null, custom_gene); 
     }); 
     }, 
    ], function(err, custom_gene) { 
     // If you want to propagate errors, uncomment the following: 
     // if (err) return callback1(err); 
     list.push(custom_gene); 
     console.log(list); 
     callback1(); 
    }); 
    } else { 
    callback1(); 
    } 
}, function(err){ 
    // if any of the saves produced an error, err would equal that error 
    if (err) { 
    console.log('An error occurred!', err); 
    } 
    console.log(list); 
}); 
Смежные вопросы