首先要感谢eventproxy提供者:JacksonTian(http://weibo.com/shyvo)。
github地址:https://github.com/JacksonTian/eventproxy
用node.js去做一些异步的I/O操作时,很容易会写成回调函数深度嵌套,例如:
1 | var add= function (v1, v2, v3){ |
如果我们使用了eventproxy这个插件,则可以更多关心业务,去掉深度嵌套,并且在一些情况下显著提高效率。
在异步操作返回结果互相不耦合的情况下,使用eventproxy会提高性能。
代码可以改写为:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 var EventProxy = require('./eventproxy');
var proxy = new EventProxy();
var add= function (v1, v2, v3){
console.log(v1+v2+v3+'');
};
proxy.assign("v1", "v2", "v3", add);
clinet1.get("key1", function (err, data) {
//do something
proxy.trigger("v1", data);
});
clinet2.get("data", function (err, data) {
//do something
proxy.trigger("v2", data);
});
clinet3.get("l10n", function (err, data) {
//do something
proxy.trigger("v3", data);
});
这样是不是很酷?先执行 proxy.assign(“v1”, “v2”, “v3”, render); 来注册整个异步回调结束后的事件,然后再同时对每个key去做get操作,这些都是异步的哦,所以会比之前按顺序获取key要快一些,当然这个得配合连接池的应用了,这个例子就使用了clinet1-3这3个redis连接。
整个代码风格易于阅读,而且效率会比之前高出一些,那eventproxy是怎么做到的呢?
我们打开它的源代码来一探究竟把。
assign方法://入口方法
1 | EventProxy.prototype.assign = function (eventname1, eventname2, cb) { //eventname1-n 是事件名, cb是最后的回调函数 |
EventProxy.prototype.once方法:
1 | /* |
核心方法了,EventProxy.prototype.bind方法:
1 | /** |
基本源代码的分析结束了,我们来总结一下把:
理论上来说实例化一次 EventProxy 可以多次享用并不会造成冲突,因为其times和length是放在函数内的局部变量,各个方法之间互不干涉。但是也有局限性,就是eventname标识不能取同名,否则就会冲突了。
EventProxy 的实现很巧妙,虽然代码互相调来调去让人头晕,其实可以稍微改写一下代码,让EventProxy 只有一个入口调用各个功能模块,功能模块之间不要互相调用,充分利用return 返回值,这样代码阅读起来会更加容易。