node中所有的操作都是异步的,有时一个函数需要上一个函数的返回值做参数,这样下来一不小心就会陷入回调地狱的陷阱中,所以学会使用异步流程控制非常重要。
- 串行无关联
多个函数或方法要依次执行,但是他们之间并没有什么联系,只有先后的顺序,比如我要写一个文件,写完之后像用户发送邮件,这两者之间没有必然的联系,但是发邮件必须在写文件完成之后。
var async = require('async');
async.series({
one: function(callback) {//回调函数callback做为参数传进来,one函数执行完毕后执行callback,并且只有callback执行了流程才会往下走否则two函数不执行
var num = 0;
setInterval(function(){
num++;
console.log('函数one:'+num);
if(num==5){
clearInterval(this);
console.log('函数one执行完毕'+'\n');
callback(null, 'one');
}
},1000)
},
two: function(callback) {
var num = 0;
setInterval(function(){
num++;
console.log('函数two:'+num);
if(num==5){
clearInterval(this);
console.log('函数two执行完毕'+'\n');
callback(null, 'two');
}
},1000)
},
}, function(error, result) { //所有步骤执行完毕后的回调函数
// console.log('error: ' + error);
console.log(result);//保存一个各步程序信息的结果集
});
运行结果:
函数one:1
函数one:2
函数one:3
函数one:4
函数one:5
函数one执行完毕
函数two:1
函数two:2
函数two:3
函数two:4
函数two:5
函数two执行完毕
{ one: 'one', two: 'two' }
这里写代码片
- 并行无关联
多个函数执行,之间没有任何的关系,也就是说谁执行都行,为了节约时间就可以使用并行流程来解决,各函数的运行结果相互之间不影响,谁先跑完谁后跑完都没有关系。
var async = require('async');
async.parallel({
one: function(callback) {//回调函数callback做为参数传进来,one函数执行完毕后执行callback,并且只有callback执行了流程才会往下走否则two函数不执行
var num = 0;
setInterval(function(){
num++;
console.log('函数one:'+num);
if(num==5){
clearInterval(this);
console.log('函数one执行完毕'+'\n');
callback(null, 'one');//把每一步的运行结果通过callback传到总的结果集中
}
},1000)
},
two: function(callback) {
var num = 0;
setInterval(function(){
num++;
console.log('函数two:'+num);
if(num==5){
clearInterval(this);
console.log('函数two执行完毕'+'\n');
callback(null, 'two');
}
},1000)
},
}, function(error, result) { //所有步骤执行完毕后的回调函数
// console.log('error: ' + error);
console.log(result);//保存一个各步程序信息的结果集
});
运行结果:
函数one:1
函数two:1
函数one:2
函数two:2
函数one:3
函数two:3
函数one:4
函数two:4
函数one:5
函数one执行完毕
函数two:5
函数two执行完毕
{ one: 'one', two: 'two' }
- 串行有关联
多个函数或方法执行,每一步执行时都需要上一步执行的结果当参数,所以就会有串行等待。会以传参的方式使各函数之间建立联系。
var async = require('async');
async.waterfall([//串行有关联是以数组的方式进行的用的是中括号而串行无关联是以对象的方式进行
function(callback) {//回调函数callback做为参数传进来,one函数执行完毕后执行callback
var num = 0;
setInterval(function(){
num++;
console.log('函数one:'+num);
if(num==5){
clearInterval(this);
console.log('函数one执行完毕'+'\n');
callback(null, 'one');//上一步的运行结果通过callback传到下一步的函数中,逐级递传,不同于串行无关联把每一步的结果全部直接传到总的回调函数中
}
},1000)
},
function(prevalue,callback) {
var num = 0;
setInterval(function(){
num++;
console.log('函数two:'+num);
if(num==5){
clearInterval(this);
console.log('函数two执行完毕'+'\n');
callback(null, prevalue+',two0');
}
},1000)
},
], function(error, result) { //所有步骤执行完毕后的回调函数
// console.log('error: ' + error);
console.log(result);//保存一个各步程序信息的结果集
});
运行结果:
函数one:1
函数one:2
函数one:3
函数one:4
函数one:5
函数one执行完毕
函数two:1
函数two:2
函数two:3
函数two:4
函数two:5
函数two执行完毕
one,two0