2012-12-01 36 views
1

我使用:和的NodeJS避免Expressjs嵌套回調查詢

  • 的NodeJS(0.6.8)
  • expressjs(2.5.2)
  • socket.io(0.8.7)
  • 節點-DB-MySQL的(0.7.6)

目前的代碼工作正常,但我不知道是否有避免回調嵌套函數的方式:

的查詢:

/************************* 
Queries 
**************************/ 
var sql_states = 'SELECT ...'; 
var sql_colors = 'SELECT ...'; 
var sql_languages = 'SELECT ...'; 
/* ... more queries */ 

嵌套查詢的執行:

/*************************  
Run queries 
**************************/ 
db.query(sql_states).execute(function(error, r) { 
    if (error) { 
     req.session.error = 'Operation failed States'; 
     res.redirect('back'); 
    } 
    else if (r.length > 0) 
    { 
     for(var i in r){ 
      states += '<option value="'+r[i]['id_state']+'">'+r[i]['name']+'</option>'; 
     } 

     var colors = ''; 

     db.query(sql_colors).execute(function(error, r) { 
      if (error) { 
       req.session.error = 'Operation failed Colors'; 
       res.redirect('back'); 
      } 
      else if (r.length > 0) 
      { 
       for(var i in r){ 
        colors += '<option value="'+r[i]['id_color']+'">'+r[i]['name']+'</option>'; 
       } 

       var languages = ''; 

       db.query(sql_languages).execute(function(error, r) { 
        if (error) { 
         req.session.error = 'Operation failed Languages'; 
         res.redirect('back'); 
        } 
        else if (r.length > 0) 
        { 
         for(var i in r){ 
          languages += '<option value="'+r[i]['id_language']+'">'+r[i]['name']+'</option>'; 
         } 
         ... 

任何建議都歡迎。

謝謝。

回答

2

您可以使用async模塊來乾淨地管理您可以夢寐以求的任何異步流量控制場景。

+0

非常感謝您的建議,我會盡力。 – alditis

2

這是異步JavaScript開發中的一個典型問題。爲了能夠爲異步函數創建一種串行執行路徑,您可以使用各種解決方案來處理大中型項目。

https://github.com/caolan/async

https://www.npmjs.com/package/promise

我個人使用異步,因爲我覺得它非常有據可查。您可以使用async.each構造輕鬆解決嵌套的回調。

async.each(openFiles, function(file, callback) { 
    // do processing for every file and return callback when async call is completed 
}, function(err){ 
    // execute this piece of code when all your processing is complete. 
});