2013-12-05 3 views
1

расслоения плотной Issue:метод async.waterfall Экспресс

Я использую express.js для извлечения данных из базы данных и отображать его в формате JSON.

Но при запуске кода в узле js отображается пустой массив (ganttresult), и когда я снова обновляю браузер, я получаю требуемый результат.

Итак, я использовал метод async.waterfall для последовательного выполнения моего кода, но такая же проблема сохраняется.

Пожалуйста, советы

var ganttresult= new Array(); 
    app.get('/get',cors(), function(request,response) { 

    async.waterfall([ 
    function(result) { 
    connection.query("SELECT id FROM Gantt",function(err, rows) { 
     if (err) { 
     console.log('error in fetching ' + err); 
     } 
     else{ 
     var all_id=rows; 

     for(var j=0;j<all_id.length;j++){ 

     connection.query("SELECT id,tailName FROM Gantt where id= '"+all_id[j].id+"'",function(err, rows) { 
     if (err) { 
     console.log('error in fetching ' + err); 
     } 
     else{ 
      var jsonString1=rows; 

     var set_id=jsonString1[0].id; 


     connection.query("SELECT itemId,name,start,end FROM GanttFlight where id= '"+set_id+"'",function(err, rows) { 
      if (err) { 
     console.log('error in fetching ' + err); 
     } 
     else{ 
     var jsonString2=rows; 
     var gantt1=new Object(); 
     gantt1.id=jsonString1[0].id; 
     gantt1.name=jsonString1[0].tailName; 
     var series = new Array(); 
     if(jsonString2.length>0){ 
     for(var i=0;i<jsonString2.length;i++){ 
     var gantt2=new Object();  
     gantt2.item=jsonString2[i]; 
     series.push(gantt2); 
    gantt1.series=series; 

     } 
     } 
     else{ 
     gantt1.series=[]; 
     } 


    ganttresult.push(gantt1); 

      }  
    }); 



    } 
    }); 
    } 
    var result= JSON.stringify(ganttresult); 
    ganttresult=[]; 
    response.send('{\"data\":'+result+'}'); 
    response.end(); 

    } 
    }); 
    } 
    ], function(err) { 
      if(err){ 
      console.log(err); 
      } 
     } 

); 
}); 
+0

Два вопроса, которые я вижу первым, это цикл for вокруг асинхронных вызовов 'connection.query', которые используют async.map или async.forEach. Второй вопрос заключается в том, что способ использования async.waterfall является избыточным. Это не имеет никакого эффекта. – Bulkan

+0

Должен ли я использовать метод async.waterfall для всех вложенных методов? – user67867

ответ

0

Я переписывание кода использовать async.waterfall правильно с async.map , но я трачу слишком много времени на это.

Вот как то, что я сделал https://gist.github.com/bulkan/7800715

Обратите внимание, что это не полная.

+0

извините, я не могу сопоставить данные между функциями. Есть ли другой способ блокировать свойство асинхронности – user67867

Смежные вопросы