Nodejs和Expressjs避免嵌套回调查询

时间:2012-12-01 18:56:30

标签: node.js express

我正在使用:

  • nodejs(0.6.8)
  • expressjs(2.5.2)
  • socket.io(0.8.7)
  • node-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 个答案:

答案 0 :(得分:2)

您可以使用async模块干净地管理您可以想到的任何异步流控制方案。

答案 1 :(得分: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.
});