1

我在用着:

  • 节点(0.6.8)
  • expressjs (2.5.2)
  • socket.io (0.8.7)
  • 节点数据库 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>';
                        }
                        ...

欢迎任何建议。

谢谢。

4

2 回答 2

2

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

于 2012-12-01T19:15:55.123 回答
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.
});
于 2015-06-30T14:29:08.773 回答