node.js中有一个异步模块async,用于流程控制,下面就来看下
async.series([function(callback){console.log(1);setTimeout(()=>{
callback(null,'1')
},1000)},
function(callback){console.log(2);setTimeout(()=>{callback(null,'2')},1000)}],(err,result)=>{
console.log(result)
console.log(err)})
/*1
2
[ '1', '2' ]
null
*/
首先是series方法,它接收两个参数,一个是函数数组,一个是回调函数,数组中的函数接受一个callback函数,只有调用这个callback函数,下一个函数才能执行,如果callback函数报错,则后面的函数不会执行,回调函数接收两个参数,它是错误优先的回调函数,err接收callback的第一个参数,result接收callback的第二个参数,组成一个数组,。例如
async.series([function(callback){console.log(1);setTimeout(()=>{
callback('false','1')
},1000)},
function(callback){console.log(2);setTimeout(()=>{callback(null,'2')},2000)}],(err,result)=>{
console.log(result)
console.log(err)})
/*
1
[ '1' ]
false
*/
然后是parallel方法,他会执行完数组中的全部函数,即使callback函数报错,如果报错,会把错误信息传给回调函数的第一个参数,然后执行回调函数,最后再执行函数数组中的其他函数
async.parallel([function(callback){console.log(1);
callback('false','1')
},
function(callback){console.log(2);callback(null,'2')}],(err,result)=>{
//console.log(result)
console.log(err)
})
/*
1
false
2
*/
还有一个是waterfall,可以将前一个函数的输出作为后一个函数的输入
async.waterfall([function(callback){
console.log('a')
callback(null,'b')
},function(arg,callback){
console.log(arg)
callback(null,'c')
}],(err,result)=>{console.log(err)
console.log(result)
})
/*
a
b
null
c
*/
如果有一个callback函数报错,后面的也不会执行,直接执行回调函数
async.waterfall([function(callback){
console.log('a')
callback('false','d')
},function(arg,callback){
console.log(arg)
callback(null,'c')
}],(err,result)=>{console.log(err)
console.log(result)
})
/*
a
false
d
*/