async.waterfall的使用 - 起点终站

我们应该感谢相遇,无论结局是喜是悲....
async.waterfall的使用
  • 首页 > 教程小结
  • 作者:起点终站
  • 2017年5月18日 17:44 星期四
  • 浏览:20243
  • 字号:
  • 评论:0
  • waterfall(tasks, [callback]) (多个函数依次执行,且前一个的输出为后一个的输入)

    按顺序依次执行多个函数。每一个函数产生的值,都将传给下一个函数。如果中途出错,后面的函数将不会被执行。错误信息以及之前产生的结果,将传给waterfall最终的callback。

    对于学过了js回调机制的小伙伴,waterfall是比较容易理解的,个人的理解就是,waterfall中传入的函数数组tasks中,后一个函数为前一个函数的回调,使用cb(null,args),这样的形式调用下一个函数,如果出现异常,则直接使用cb(new Error("错误的信息"))这样的方式来捕捉异常,并调用最终的回调函数来处理,在这种情况下,出现异常的函数后面那些函数,将不再继续执行,测试代码如下:


    var async = require('async');
    var a = 10;
    async.waterfall([
        function(cb) {
            console.log("getb")
            setTimeout(function() {
                if (a == 0) {
                    cb(new Error("a不能为0"));
                } else {
                    var b = 1 / a;
                    cb(null, b); //在这里通过回调函数把b传给下一个函数,记得一定要加上null,才能调用数组中得下一个函数,否则,会直接调用最终的回调函数,然后结束函数,则后面的函数将不再执行
                    //如果这里写成cb(b);
                    //结果会变成:
                    /**
                     *getb
                     *0.1
                     **/
                }
            }, 1000);
        },
        function(b, cb) {
            setTimeout(function() {
                console.log("getc")
                var c = b + 1;
                cb(null,c);
            }, 1000);
        }
    ], function(err, result) {
        if (err) {
            console.log(err);
        } else {
            console.log('c:' + result)
        }
    });
    当a = 0时,会直接抛出错误,输出如下:
    getb
    Error: a不能为0
    先执行了第一个函数,在第一个函数中抛出异常之后,直接执行最终的回调函数,并没有接着执行第二个函数。
    a = 10 时,输出如下:
    getb
    getc
    1.1
    先执行了第一个函数,然后把第一个函数算出的b传给了第二个函数,再次算出第二个函数中得C,传给最终的结果result。


      您阅读这篇文章共花了:  
    本文作者:起点终站      文章标题: async.waterfall的使用
    本文地址:https://blog.hellozwh.com/?post=279
    版权声明:若无注明,本文皆为“起点终站”原创,转载请保留文章出处。
    • blogger
    返回顶部| 首页| 手气不错| 网站地图| sitemap| 装逼生成器| 站长介绍|

    Copyright © 2016-2019 起点终站 闽ICP备16011094号-1