【node】回调地狱解决之async

一、why?为什么要使用async

因为嵌套回调的问题:

eg:

    async1(function(){

        async2(function(){

            async3(function(

                async4(funciton(){

                    async5(function(){

                          //...

                    });

                });

            ));

        });

    });

so:

我们可以使用async来使结果更清晰,代码更容易理解,并且耦合度不是那么高

二、How?怎么用

npm 安装好async模块,

npm i async -s

然后引入就可以使用 

var async = require('async');

这里保留最常用的三个

1. async.series(tasks,[callback])

多个函数从上到下依次执行,相互之间没有数据交互

 

    var task1 =function(callback){

        console.log("task1");

        callback(null,"task1")

    }

    var task2 =function(callback){

        console.log("task2");

        callback(null,"task2")

    }

    var task3 =function(callback){

        console.log("task3");

        callback(null,"task3")

    }

    async.series([task1,task2,task3],function(err,result){

        console.log("series");

        if (err) {

            console.log(err);

        }

        console.log(result);

    })

运行结果:

最后的返回是一个按顺序执行的回调结果数组,

如果中途发生错误,则将错误传递到回调函数,并停止执行后面的函数

结果数组中也不会占位置

eg:

 

2.async.parallel(tasks,[callback])

多个函数并行执行,不会等待其他函数

 

    var task1 =function(callback){

        console.log("task1");

        setTimeout(function(){

            callback(null,"task1")

        },5000);

    }

    var task2 =function(callback){

        console.log("task2");

        setTimeout(function(){

            callback(null,"task2")

        },1000);

    }

    var task3 =function(callback){

        console.log("task3");

        setTimeout(function(){

            callback(null,"task3")

        },3000);

    }

    console.time("parallel方法");

    async.parallel([task1,task2,task3],function(err,result){

        console.log("parallel");

        if (err) {

            console.log(err);

        }

        console.log(result);

        console.timeEnd("parallel方法");

    })

 

运行结果:

 

3个函数分别延迟5000ms,1000ms,3000ms 结果5000ms就执行完毕.

 

如果中途出错,则立即将err和值传到最终的回调函数,其他未执行完毕的函数将不再执行,但是结果数组中会占一个位置

eg:

 

3.waterfall(tasks,[callback]) :瀑布流

依次执行,前一个函数的输出为后一个函数的输入

   var task1 =function(callback){

        console.log("task1");

        callback(null,"11")

   }

    //除了callback还有一个q,是上一级的传参

    var task2 =function(q,callback){

        console.log("task2");

        console.log("task1函数传入的值: "+q);

        callback(null,"22")

    }

    var task3 =function(q,callback){

        console.log("task3");

        console.log("task2函数传入的值: "+q);

        callback(null,"33")

    }

    console.time("waterfall方法");

    async.waterfall([task1,task2,task3],function(err,result){

        console.log("waterfall");

        if (err) {

            console.log(err);

        }

        console.log("result : "+result);

        console.timeEnd("waterfall方法");

    })

执行结果:

返回的不是结果数组,而是一个唯一结果

如果中途出现错误,后面的函数将不在执行,之前执行的结果和错误信息将直接传到最终的回调函数

 

如果前后数据有传递关系的话,可以用这个

POST:https://blog.csdn.net/zzwwjjdj1/article/details/51857959

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值