nodejs waterfall的使用

通和裕
2023-12-01

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。

 

 类似资料: