1、函数式编程
- 异常处理
- 函数嵌套过深
- 阻塞代码
- 多线程编程f
3、异步编程解决方案
3.1、事件发布/订阅模式
事件发布常常用来解耦业务逻辑,发布者无需关注订阅的侦听器如何实现业务逻辑。
操作简单,示例代码
1 2 3 4 5 6 7
| emitter.on("event1",function(message){ console.log(message); }); emitter.emit("event1","O am message!");
|
Node对事件发布/订阅做了额外的处理
- 对一个事件添加超多10个侦听器会得到一条警告。
- 为了处理异常,EventEmitter对error事件进行了特殊处理。
- 继承自events模块
- 利用事件队列解决雪崩问题
- 多异步之间的协作方案
- EventProxy的原理
- EvenrttProxy的异常处理
继承自events模块
Node在util模块中封装了集成的方法
1 2 3 4 5
| var events =require('evbents'), function Stream(){ events.EventEmitter.call(this); } util.inherits(Stream,events.EventEmitter);
|
利用事件队列解决雪崩问题
雪崩问题:在高访问量、大并发量的情况下缓存失效的情景。
EventProxy来自于Backbone的事件模块,它是对事件订阅/发布模式的扩充。
Backbone.js为复杂WEB应用程序提供模型(models)、集合(collections)、视图(views)的结构。其中模型用于绑定键值数据和自定义事件;集合附有可枚举函数的丰富API; 视图可以声明事件处理函数,并通过RESRful JSON接口连接到应用程序。
此项目托管在 GitHub 上, 并且提供 带注释的源码, 在线的 测试套件, 应用示例, 教程列表 还有一个 实际应用项目的超长列表, 这些项目都使用了 Backbone. Backbone 允许在 MIT 软件协议 下使用.
EventProxy的异常处理:
1 2 3 4 5 6 7 8 9 10 11 12 13
| //主要抽象出了done()和fail()函数,简化流程操作和代码量。 var ep=new EventProxy(); ep.all('tpl','data',function(tpl,data){ //成功回调 callback(null,{ template:tpl, data:data }); }); //绑定错误处理函数 ep.fail(callback); fs.readFile('template.tpl','utf-8',ep.done('tpl')); db.get('some sql',ep.done('data'));
|
3.2、Promise/Deferred模式
3.3、流程控制库