本篇介绍关于 Node.js 事件代理的一个解决方案。
项目实践中,有遇到使用 nodejs 解决实际问题场景。Node.js 以 Javascript 作为语言,解决问题时,采用了 EventProxy 做事件代理,避免事件嵌套回调。
EventProxy 做为一个组件,包含如下特点:
- 内部包含事件代理机制,能避免多重回调嵌套问题
- 符合 CMD,AMD 及 CommonJS 等其它的模块设计标准
- 包装友好的回调处理监听器,包含标准的 Node.js 错误处理方法
- 兼容多平台,能够被应用到 Node.js 和各种浏览器环境中
一、Eventproxy 解决问题的例子
在使用 Node.js 解决问题的时候,经常遇到多函数嵌套回调问题,引用例子:
为了避免这种较为臃肿的代码编写方式,可以考虑使用 Eventproxy 组件解耦调用模块,引用例子:
二、Eventproxy 拥有的接口
- addListener 绑定事件监听器
- after 在某个事件之后在限制的次数之内执行某个监听器
- all 在所有绑定事件触发之后,执行一次监听器
- any 在某个绑定的事件触发之后,执行一次监听器
- asap 绑定事件,并且执行一次监听器
- assign 等同于 all
- assignAll 在所有绑定事件触发之后,优先执行一次监听器
- assignAlways 等同于 assignAll
- bind 等同于 addListener
- done 返回一个事件成功执行的代理函数
- doneLater 返回一个事件成功执行的异步代理函数
- emit 触发事件, 并且执行所有监听器
- emitLater 异步触发事件, 并且执行所有监听器
- fail 绑定一个只执行一次的错误回调函数
- fire 触发某个事件,并且执行所有监听器
- group 按绑定顺序执行某个监听器,并且将结果有序返回给用 after 绑定在这个事件的监听器
- immediate 等同于 asap
- not 绑定时间监听器,非某个事件执行监听器
- on 等同于 addListener
- once 绑定并且返回只执行一次的事件监听器
- removeAllListeners 等同于 removeListener
- removeListener 移除事件的监听器
- subscribe 等同于 addListener
- tail 等同于 assignAll
- trigger 等同于 emit
- unbind 等同于 removeListener
- Eventproxy.create 创建一个 Eventproxy 实例。如果有绑定事件,在每次事件触发后,减少调用参数,执行相应监听器。
三、Eventproxy 安装和使用
Node 用户
通过 NPM 安装即可使用:
调用:
普通环境
在页面中嵌入脚本即可使用:
<script src="https://raw.github.com/JacksonTian/eventproxy/master/lib/eventproxy.js"></script>
使用:
参考资料:
- https://npmjs.org/package/eventproxy
- https://github.com/JacksonTian/eventproxy
- https://github.com/JacksonTian/eventproxy/blob/master/lib/eventproxy.js
- http://nodejs.org/api/process.html#process_process_nexttick_callback
林守煌 2014 年 2 月 25 日
1. 我能想到的一个方法 (只是猜想, 未验证) 是直接使用 nodejs 的内置对象 EventEmitter 进行事件的发射及监听例如:
var A = function(argsFromB) {
//do something
}
var B = function(callback) {
callback(argsToA);
}
var C = function(callback) {
callback(argsToB);
}
C(B(A))
的调用方式能改为:
var emitter = new events.EventEmitter()
var A = function(args) {
emitter.emit(“aFinish”, output)
}
var B = function(args) {
emitter.emit(“bFinish”, output)
}
var C = function(args) {
emitter.emit(“cFinish”, output)
}
emitter.on(“cFinish”, B);
emitter.on(“bFinish”, A);
C();
但无论如何都无法解决一个我现在正在苦恼的问题: 我是 nodejs 的初学者, 正在使用 nodejs 搭建一个 mvc 网站, 发现 一个方法必须等待两个 io 方法取数据返回后才能继续进行, 如果在同步的代码中应该是这样的:
var B = function(){}
var C = function(){}
var A = function() {
dataB = B();
dataC = C();
//do something with dataB and dataC
}
所以本文中的方式及以上提到的方法都适用了, 不知道有没好的建议?
TAT.iAzrael 2014 年 2 月 28 日
eventproxy 可以解决这个问题
var EventProxy = require(‘eventproxy’);
var ep = new EventProxy();
ep.all(‘getDataBSucc’,’getDataCSucc’, function(dataB,dataC){
//do something with dataB and dataC
});
fs.readFile(xxx, function(args) {
ep.emit(“getDataBSucc”, output)
})
fs.readFile(yyy,function(args) {
ep.emit(“getDataCSucc”, output)
})
奋斗的小麦兜 2014 年 2 月 15 日
看看~留个脚印
node.js开发系列文章 - ^styleYan 2014 年 2 月 8 日
[…] Node.js 系列之——事件代理 […]