async的方法是流程控制包,主要提供的异步功能。
npm install async
一、async.series 串行且无关联
var async = require('async');
//======================串行且无关联
async.series([
function(callback) {
// do some stuff ...
callback(null, 'one');
},
function(callback) {
// do some more stuff ...
callback(null, 'two');
}
],
// optional callback
function(err, results) {
// ['one', 'two']
console.log(results);
});
async.series({
one: function(callback) {
setTimeout(function() {
callback(null, 1);
}, 200);
},
two: function(callback){
setTimeout(function() {
callback(null, 2);
}, 100);
}
},
function(err, results) {
// {one: 1, two: 2}
console.log(results);
});
二、async.waterfall 串行且关联
//===========串行且关联
//依次执行,前一个函数的输出为后一个函数的输入
//使用waterfall可以保证一序列函数执行的顺序,如果函数执行失败了,会直接中断处理流程。比较可靠的办法是,重试流程。 async.retry
async.waterfall([
function(callback) {
callback(null, 'one', 'two');
},
function(arg1, arg2, callback) {
// arg1 为'one' and arg2 为'two'
//retry(opts, task, callback)
async.retry({times:5, interval:1000}, function(callback) {
callback(null, 'three')
}, function(err, result) {
callback(err, result);
});
},
function(arg1, callback) {
// arg1 为 'three'
callback(null, 'done');
}
],
function (err, result) {
// 'done'
console.log(result);
});
function myFirstFunction(callback) {
callback(null, 'one', 'two');
}
function mySecondFunction(arg1, arg2, callback) {
// arg1 为 'one' and arg2 为 'two'
callback(null, 'three');
}
function myLastFunction(arg1, callback) {
// arg1 为 'three'
callback(null, 'done');
}
console.time("waterfall方法");
// Or, with named functions:
async.waterfall([
myFirstFunction,
mySecondFunction,
myLastFunction,
],
function (err, result) {
// result now equals 'done'
console.log(result);
console.timeEnd("waterfall方法");
});
三、async.parallel 并行无关联
async.parallel([
function(callback) {
setTimeout(function() {
callback(null, 'one');
}, 500);
},
function(callback) {
setTimeout(function() {
callback(null, 'two');
}, 100);
}
],
function(err, results) {
// +++++++ [ 'one', 'two' ]
console.log("+++++++", results);
});
async.parallel({
one: function(callback) {
setTimeout(function() {
callback(null, 1);
}, 200);
},
two: function(callback) {
setTimeout(function() {
callback(null, 2);
}, 100);
}
},
function(err, results) {
// ===== { two: 2, one: 1 }
console.log("=====", results);
});
四、async.eachSeries
async.eachSeries(arrs, (arr, callback) => {
//执行一些相应的操作
callback();//当单前操作完成后使用callback执行下一个操作。
},(err,results)=>{
//循环执行完成后可以执行这里的操作。
})
var arr = [300,600];
async.eachSeries(arr, function(item, callback) {
setTimeout(function(){
//这个函数告诉eachSeries函数,这个异步操作状态,是成功了,还是失败了,传(false)null表示这个异步成功完成,true(1)执行失败,还未执行的不再执行
callback(null);
console.log(item);
}, item);
}, function(err) {
//所有的异步成功执行完成,err等于null
console.log(err);
});
用于循环异步操作并且是执行同一种方法,当一次执行完成后使用callback继续进行下一个操作,当整个异步函数执行完成后可以在下面按照顺序执行。