2012-12-01 37 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. 
});