• nodejs waterfall的使用


    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。

  • 相关阅读:
    NO29 用户提权sudo配置文件详解实践--志行为审计
    NO28 第四关考试题
    NO27 定时任务
    NO26 Linux的文件权限--chmod--Linux删除文件说明--suid--sgid
    NO25 三剑客之SED行天下
    NO24 第三关--企业面试题
    gcc编译错误表
    C++的精髓——虚函数
    gcc 优化选项 -O1 -O2 -O3 -Os 优先级,-fomit-frame-pointer
    正确使用#include和前置声明(forward declaration)
  • 原文地址:https://www.cnblogs.com/simadi/p/7018863.html
Copyright © 2020-2023  润新知