async

今天突然想起一个很好玩的模块也是非常好的类库async,来做一些扩展
jq中 $.ajax的参数中就有async,用来设置是否异步,而同步异步对于前端开发来讲肯定也是新词了这里就不多复述了,首先async 是nodejs中一个很好的类库 https://caolan.github.io/async/ 要学会看API
Async是一个流程控制工具包,提供了直接而强大的异步功能
它有很多功能,这里小弟仅在概念上做为引导,这里我们引入三个概念。

  • 并行无关联
  • 串行无关联
  • 串行有关联

首先第一步npm install --save async

并行无关联

我们先来看并行无关联
关键字 parallel(tasks, callback)第一个参数就是任务,要以数组或者对象的形式来写任务集
第二就是回调函数

// 并行无关联,数组输出形式,并且输出时间以最大时间为主
console.time('test1');
async.parallel([
    function(callback) {
        setTimeout(function() {
            callback(null, 'one');
        }, 1000);
    },
    function(callback) {
        setTimeout(function() {
            callback(null, 'two');
        }, 2000);
    }
],
function(err, results) {
    console.log(results);
	console.timeEnd('test1');//因为异步运行的过程我们是看不到的 因此我们用定时器来模拟 用console.time/timeEnd 来输出程序运行时间
});

//并行无关联,对象输出形式,并且输出时间以最大时间为主
//如果将one/two位置互联,并且将时间也互换,那么输出的顺序将会是什么呢?(以时间先后为顺序)
console.time('test2');
async.parallel({
    one: function(callback) {
        setTimeout(function() {
            callback(null, 'two');
        }, 1000);
    },
    two: function(callback) {
        setTimeout(function() {
            callback(null, 'one');
        }, 2000);
    }
}, function(err, results) {
	console.log(results);
	console.timeEnd('test2');
});

结果

[ 'one', 'two' ]
test1: 2001.537ms // 其中2000ms 为定时器的时间  
{ one:'two', two: 'one' }
test2: 2001.987ms

通过结果我们可以发现异步无关联中与我们书写的顺序没有关系,而总时间取决于最后一个完成的任务所需的时间。

串行无关联

关键字series(tasks, callback)
参数同上

//串行无关联,数组结果输出模式
//如果将one,two位置切换,查看执行顺序是否会改变(顺序不会发生变化)
//如果callback中的null修改成'null'这种错误的形式,看看会发生什么变化(一个出错,全部停运)
async.series([
    function(callback) {
        callback(null, 'one');
    },
    function(callback) {
        callback(null, 'two');
    }
],
function(err, results) {
    console.log(results);
});
// 串行无关联,对象结果输出模式
async.series({
    one: function(callback) {
            callback(null, 1);
    },
    two: function(callback){
            callback(null, 2);
    }
}, function(err, results) {
    console.log(results);
});
// 串行无关联,对象结果输出模式,可以利用console.time来计算输出的结果时间
// 很明显,因为是串联,所以运算时间为合计时间输出
// 可以把one,two位置进行更换,会发现输出结果以代码执行顺序为结果
console.time('test');
async.series({
    one: function(callback) {
        setTimeout(function() {
            callback(null, 'one');
        }, 1000);
    },
    two: function(callback){
        setTimeout(function() {
            callback(null, 'two');
        }, 2000);
    }
}, function(err, results) {
    console.log(results);
	console.timeEnd('test');
});

输出结果

[ 'one', 'two' ]
{ one: 1, two: 2 }
{ one: 'one', two: 'two' }
test: 3001.663ms

这里我们留出一个疑问 如果在上面最后一个代码中讲定时器的时间交换,会输出什么结果呢?
如果换做数组的写法呢?又会怎么样?
我们会发现如果是对象形式它的顺序会受到时间影响顺序,但数组不会,因为对象是属性和方法的无序集合,而数组是有顺序的。

串行有关联

关键词waterfall(tasks, callback)
顾名思义串行有关联就是每一阶段的任务都有可能影响到后续的运行结果结合实例看

async.waterfall([
    myFirstFunction,
    mySecondFunction,
    myLastFunction,
], function (err, result) {
	console.log(result);
});

function myFirstFunction(callback) {
    callback(null, 'one', 'two');
}
function mySecondFunction(arg1, arg2, callback) {
    // arg1 对应 'one' and arg2 对应 'two'
    callback(null, arg1,arg2,'three');
}
function myLastFunction(arg1,arg2,arg3, callback) {
    // 与上面类似
    callback(null, [arg1,arg2,arg3,'done']);//最后传递两个参数 
}

结果

[ 'one', 'two', 'three', 'done' ]
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐