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。
nodejs waterfall的使用的更多相关文章
- nodejs 回调地狱解决 promise async
nodejs毁掉地狱是一直被人诟病的,以下总结一下解决毁掉地狱的一些方法.(暂时研究的比较浅) 1.promise promise模式在任何时刻都处于以下三种状态之一:未完成(unfulfilled) ...
- (四)、 nodejs中Async详解之一:流程控制
为了适应异步编程,减少回调的嵌套,我尝试了很多库.最终觉得还是async最靠谱. 地址:https://github.com/caolan/async Async的内容分为三部分: 流程控制:简化十种 ...
- (一)Nodejs - 框架类库 - Nodejs异步流程控制Async
简介 Async是一个流程控制工具包,提供了直接而强大的异步功能 应用场景 业务流程逻辑复杂,适应异步编程,减少回调的嵌套 安装 npm insatll async 函数介绍 Collections ...
- NodeJS学习笔记(二)
对NodeJS的基本配置了解之后,现在需要解决一些显示问题,大致有以下问题 1.与PHP框架Laravel的密码验证系统相适应 2.异步调用的常见编程问题:Promise和Ev ...
- nodejs学习笔记 —— 异步编程解决方案
在js或者node编程中,由于异步的频繁和广度使用,使得回调和嵌套的深度导致编程的体验遇到一些挑战,如果写出优雅和好看的代码,本文主要针对异步编程的主流方案做一些总结 1.事件发布/订阅模式 事件监听 ...
- nodejs异步转同步
项目在微信环境开发,需要获取access_token进行授权登录和获取用户信息. 特意把这块功能拿出来封装一个自定义module module.exports = new Wechat(con.app ...
- nodejs高并发大流量的设计实现,控制并发的三种方法
nodejs高并发大流量的设计实现,控制并发的三种方法eventproxy.async.mapLimit.async.queue控制并发Node.js是建立在Google V8 JavaScript引 ...
- nodejs async
官网:https://github.com/caolan/async 流程控制:简化十种常见流程的处理集合处理:如何使用异步操作处理集合中的数据工具类:几个常用的工具类 流程控制 详细说明:http: ...
- nodejs中Async详解之一:流程控制
为了适应异步编程,减少回调的嵌套,我尝试了很多库.最终觉得还是async最靠谱. 地址:https://github.com/caolan/async Async的内容分为三部分: 流程控制:简化十种 ...
随机推荐
- 115个Java面试题和答案(上)
转自:http://www.importnew.com/10980.html 本文我们将要讨论Java面试中的各种不同类型的面试题,它们可以让雇主测试应聘者的Java和通用的面向对象编程的能力.下面的 ...
- Tagger: Deep Unsupervised Perceptual Grouping
没看论文,但看了介绍视频,简直做了一个小型纪录片. 视频地址:https://www.youtube.com/watch?v=jfB_lWZA4Qo 中文翻译:http://blog.csdn.net ...
- java---servlet与filter的联系与区别
filter是一个可以复用的代码片段,可以用来转换HTTP请求.响应和头信息.Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应. 最近使用插 ...
- linux -- chcp
mysql在控制台中,插入数据到数据库的某个表中,插入的数据中有中文,结果一直显示错误Incorrect string...,不能插入成功 猜测是编码格式不一致.可通过chcp命令修改控制台编码格式 ...
- epplus excel数据导出(数据量有点大的情况) Web和Client
Asp.net MVC后台代码 public ActionResult Export() { OfficeOpenXml.ExcelPackage ep = new OfficeOpenXml.Exc ...
- Yii2.0实现微信公众号后台开发
接入微信 Yii2后台配置 1.在app/config/params.php中配置token参数 return [ //微信接入 'wechat' =>[ 'token' => 'your ...
- freemarker0
assign 用于为该模板页面 创建或替换一个顶层变量 或创建或替换多个顶层变量 列子如下 <#assign name=value [in namespacehash]>,指定一个名为n ...
- Angular2 Observable 可观察对象
可观察对象支持在应用中的发布者和订阅者之间传递消息.在需要进行事件处理,异步编程和处理多值的时候,可观察对象相对其他技术有显著的优点. 可观察对象是声明式的 —— 也就是说,虽然你定义了一个用于发布值 ...
- Juicer——a fast template engine
https://blog.csdn.net/yutao_struggle/article/details/79201688 当前最新版本: 0.6.8-stable Juicer 是一个高效.轻量的前 ...
- IOS7开发~新UI学起(一)
本文转载至:http://blog.csdn.net/lizhongfu2013/article/details/9124893 IOS7在UI方面发生了很大改变,所以感觉有必要重新审视的学习一下(新 ...