2014-02-06 37 views
0

我的nodejs應用程序做的一切都很好,但由於嵌套數據庫查詢,我無法知道該進程是否已完成。在嵌套數據庫查詢完成後進行回調

的過程是這樣的:

function saveToDB(allData, callback) { 
     var connection = mysql.createConnection({ 
      host: 'localhost', 
      user: 'root', 
      database: 'node' 
     }); 
     [].forEach.call(Object.keys(allData), function(prop){             

      var conditions = {link: allData[prop]['link']}; 
      connection.query("SELECT link FROM articles WHERE ?", conditions, function(err, rows, fields) { 
       if(rows.length < 1) { 
        connection.query('INSERT INTO articles SET ?', { 
          link: allData[prop].link, 
          title: allData[prop].title, 
          description: allData[prop].description, 
          pubDate: allData[prop].pubDate 
        }, function(err, result){ 
          if(err) throw err; 

        }); 
       }   
      }); 

      //Still there are some 
     }); 
} 

我想打電話的時候,環路和查詢完callback,這樣我就可以關閉connection或退出程序。

有什麼想法?

我試圖用asyncconcat的方法,但我無法弄清楚如何。

+0

你需要'async.forEach' – SLaks

+0

或者使用'async.reduce',創造一個大的INSERT查詢 – Sonata

+0

@SLaks你的意思是使用'async.forEach'而不是'[] .forEach'? – Maxali

回答

1

的骯髒的解決方案可以是一個計數器,增量在每次啓動和結束後下降...

function saveToDB(allData, callback) { 
     var inProgress = 0; 
     function done(){ 
      if(inProgress <= 0) callback(); 
     } 
     var connection = mysql.createConnection({ 
      host: 'localhost', 
      user: 'root', 
      database: 'node' 
     }); 
     [].forEach.call(Object.keys(allData), function(prop){             
      inProgress++; 
      var conditions = {link: allData[prop]['link']}; 
      connection.query("SELECT link FROM articles WHERE ?", conditions, function(err, rows, fields) { 
       if(rows.length < 1) { 
        connection.query('INSERT INTO articles SET ?', { 
          link: allData[prop].link, 
          title: allData[prop].title, 
          description: allData[prop].description, 
          pubDate: allData[prop].pubDate 
        }, function(err, result){ 
          inProgress--; 
          if(err) throw err; 
          done(); 

        }); 
       }   
      }); 

      //Still there are some 
     }); 
} 
+0

謝謝。有用。我將'inProgress'初始化爲'var inProgress = allData.length;'的saveToDB()並將'inProgress - ; done();'添加到第一個數據庫查詢結果的'else'部分。 – Maxali