我一直在使用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();
}
在此流程中,由于需要业务逻辑,因此正在使用loops
,sequential
,parallel
和conditional
异步回调的组合。如果任何函数由于任何原因没有返回回调,则很难进行故障排除。我尝试使用日志框架进行调试,但由于node.js的异步性质,它显然效率不高。
有没有好办法
谢谢!
答案 0 :(得分:0)
改善调试的几种方法
使用vasync module这就像异步但调试更好
vasync可能没有您需要的所有工具,因此promisify (bluebird)所有回调并使用promises,以便函数至少返回.then
和.catch
例如,在请求模块中:
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
中的错误,并将错误传回最高级别。