一、概念
Async:异步流程控制。async不是node里的模块,但是在做node开发时,经常会用到,以前要用到jQuery的defer,async的功能更强大。
二、安装
1. 先 npm init项目(或cnpm init)
2. 安装async:npm install async --save-dev
三、常用的功能
1. 串行无关联:串行程序的执行时间是所有函数的执行时间之和
2. 并行无关联:并行程序的执行时间是时间最长的那个函数的时间
3. 串行有关联
四、代码实现
1. 串行无关联——用数组
async.series([],function(){});
var async = require("async");//这里的style是编辑代码的时候自动加上去的,忽略
console.time('time');//记录程序执行的开始时间
async.series([
function(callback){
console.log("first……");
setTimeout(function(){
callback(null,'first');
},2000);
},
function(callback){
console.log("second……");
setTimeout(function(){
callback(null,'second');
},3000);
}
],function(err,result){//执行完两个函数后,把结果都放在了result里了。
console.log(result.length);
console.log(result);//执行完两个函数后,把结果都放在了result里了。
console.timeEnd('time');//计算程序的整个执行需要的时间长度
}
2. 串行无关联——用对象
async.series({},function(){});
var async = require("async");
console.time('time');//记录程序执行的开始时间
async.series({
one: function (callback) {
console.log("first……");
setTimeout(function () {
callback(null, 'first');
}, 1000);
},
two: function (callback) {
console.log("second……");
setTimeout(function () {
callback(null, 'second');
}, 2000);
}
},function(err,result){//执行完两个函数后,把结果都放在了result里了。
console.log(result);//执行完两个函数后,把结果都放在了result里了。
console.timeEnd('time');//计算程序的整个执行需要的时间长度
}
);
3. 并行无关联——用数组
async.parallel([],function(){});
var async = require("async");
console.time('time');//记录程序执行的开始时间
async.parallel([
function(callback){
console.log("first……");
setTimeout(function(){
callback(null,'first');
},2000);
},
function(callback){
console.log("second……");
setTimeout(function(){
callback(null,'second');
},3000);
}
],
function(err,result){//执行完两个函数后,把结果都放在了result里了。
console.log(result.length);
console.log(result);//执行完两个函数后,把结果都放在了result里了。
console.timeEnd('time');//计算程序的整个执行需要的时间长度
}
4. 并行无关联——用对象
和第2点的写法类似,大家自己思考下,试试!
async.parallel({},function(){});
5. 串行有关联——数组
async.waterfall([],function(){});
async.waterfall([
function(callback){
console.log("first……");
setTimeout(function(){
callback(null,'first');
},3000);
},
function(arr1,callback){
console.log("second……");
setTimeout(function(){
callback(null,arr1,'second');
//执行callback就相当于执行下一个funciton;
//callback中的arr1传给了下一个funciton中的arr1;callback中的‘second’传给了下一个function中的arr2
},2000);
},
function(arr1,arr2,callback){
console.log("third……");
setTimeout(function(){
callback(null,[arr1,arr2,'three']);
},1000);
}
],function(err,result){ console.log(result);});
思考一下:为什么串行有关联不用对象的方式呢?
五、应用
在处理异步代码时,如果想要让其以同步流程表现出来,可以用串行;如果函数与函数之间有联系,就用串行有关联,如果函数之间没有关系的话,就用串行无关联。
比如: 当我们进行数据库的查询时,需要查询多个数据库,中间会有异步操作,比如第一个数据库查询完后,才能去查询另一个数据库,对数据库的两次查询可以通过嵌套来实现,达到同样的效果,但是如果有很次的数据库查询操作呢?相信你一定会晕的!!!这时候可以使用串行无关联或串行有关联,把每一次的数据库操作写成一个函数,最后通过function(err,result){};这个回调函数(async.waterfall([],function(){});的第二个参数)对得到的数据进行统一的处理。是不是就变得很方便了呢?
这里用到的串行有关联或无关联就相当于promise的效果!!!
你学会了吗?