Node.JS异步回调

时间:2016-05-04 03:21:11

标签: node.js callback asynccallback node-async

我一直在使用async模块来管理我的代码流,它确实是一个非常强大的库。但是,随着代码变得越来越大,逻辑流变得越来越复杂,我遇到了一个问题,需要管理async_callback太多。一些伪代码来演示如下问题

async.auto({
   getjobs:function(cb){},
   loopjobs:['getjobs']{
      async.map(jobs,dojob(job, cb_map),cb); 
   },
}, function(err, result) {
    //handle
}); 

function dojob(job, callback) {
    async.auto({
        step1:function(cb){},
        step2:['step1', function(cb) {}],
        step3:['step1', function(cb) {
           moreloops(params, cb);
        }]
    }, callback)
}

function moreloops(params, cb) {
    async.map(params, doloop(param, cb_map), cb);
}

function dbloop(param, cb) {
    //dosomething
    cb();
}

在此流程中,由于需要业务逻辑,因此正在使用loopssequentialparallelconditional异步回调的组合。如果任何函数由于任何原因没有返回回调,则很难进行故障排除。我尝试使用日志框架进行调试,但由于node.js的异步性质,它显然效率不高。

有没有好办法

  1. 改善编码流程
  2. 确定流程停止的功能。
  3. 谢谢!

1 个答案:

答案 0 :(得分:0)

改善调试的几种方法

  1. 使用vasync module这就像异步但调试更好

  2. vasync可能没有您需要的所有工具,因此promisify (bluebird)所有回调并使用promises,以便函数至少返回.then.catch

  3. 例如,在请求模块中:

    var request = require('request');
    function makeRequest(cb) {
        request(url, function(err, res, body) {
            cb(err, body);
        });
    }
    

    变为

    var Promise = require('bluebird');
    var request = Promise.promisify(require("request"));
    Promise.promisifyAll(request);
    
    function makeRequest(cb) {
        request(url)
            .then(function(response) {
                var body = response.body;
                cb(null, body);
            })
            .catch(cb);
    }
    

    通过.then中的所有成功和.catch中的错误,并将错误传回最高级别。