Async 异步流程控制

一、概念

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的效果!!!

        你学会了吗?


猜你喜欢

转载自blog.csdn.net/chenwei1113/article/details/79380869