标签:
本文介绍其中最简单最常用的流程控制部分。
由于nodejs是异步编程模型,有一些在同步编程中很容易做到的事情,现在却变得很麻烦。Async的流程控制就是为了简化这些操作。
npm install async --save -d
这个函数名为waterfall(瀑布),可以想像瀑布从上到下,按顺序依次执行多个函数。不同之处,每一个函数产生的值,都将传给下一个函数。如果中途出错,后面的函数将不会被执行。错误信息以及之前产生的结果,将传给waterfall最终的callback。
注意,该函数不支持json格式的tasks。
async.waterfall([
function(cb) {
util.formParse(req,function(err,result){ //from解析
cb(err,result);
});
},
function(user, cb) {
courseCtrl.create(course,function(err,result){ //保存到数据库
cb(err,result);
})
}
], function (err, result) {
if(err) throw err;
var results = util.response.regOK;
results.item = result;
res.send(results);
});
并行执行多个函数,每个函数都是立即执行,不需要等待其它函数先执行。传给最终callback的数组中的数据按照tasks中声明的顺序,而不是执行完成的顺序。
如果某个函数出错,则立刻将err和已经执行完的函数的结果值传给parallel最终的callback。其它未执行完的函数的值不会传到最终数据,但要占个位置。
支持json形式的tasks,其最终callback的结果也为json形式。
async.parallel({
count:function(cb){
courseController.count( req.query ,cb); //课程数目
},
list:function(cb){
courseController.getList( req.query ,cb); //课程列表
}
},function(err,results){
res.send(results);
});
{
count:2,
list:[
{
courseid:xxx,
name:xxx
},
{
courseid:xxx,
name:xxx
}
]
}
用来处理有依赖关系的多个任务的执行。比如某些任务之间彼此独立,可以并行执行;但某些任务依赖于其它某些任务,只能等那些任务完成后才能执行。虽然我们可以使用async.parallel和async.series结合起来实现该功能,但如果任务之间关系复杂,则代码会相当复杂,以后如果想添加一个新任务,也会很麻烦。这时使用async.auto,则会事半功倍。
如果有任务中途出错,则会把该错误传给最终callback,所有任务(包括已经执行完的)产生的数据将被忽略。
根据uid(用户id)和course_id(课程id)获取用户信息和用户收藏的视频:
根据uid,在user表中获取用户信息;
根据course_id,在course表中获取课程信息,含teacher_id;
根据teacher_id,在user表中获取讲师信息(上一步执行完,才能执行);
最后,返回userInfo,courseInfo,tearcherInfo;
async.auto({
userInfo:function(cb){
userCtrl.getInfo({uid:req.query.uid}, function (err, result) { //用户信息
cb(err,result);
});
},
couseInfo:function(cb){
courseCtrl.getInfo(req.query.courseid, function (err, result) { //课程信息
cb(err,result);
});
},
tearcherInfo:[‘couseInfo‘, function(results,cb) {
userCtrl.getInfo({uid:results.couseInfo.teacherid},function(err,result){ //讲师信息
cb(err,result);
});
}]
},function(err,results){
if (err) throw err;
res.send(results);
});
{
userInfo:{
uid:xxx,
name:xxx
},
courseInfo:{
courseid:xxx,
name:xxx
},
tearcherInfo:{
uid:xxx,
name:xxx
}
}
标签:
原文地址:http://www.cnblogs.com/wuwanyu/p/wuwanyu20160407.html