一、EventProxy简介
EventProxy作者 田永强,新浪微博@朴灵,前端工程师,曾就职于SAP,现就职于淘宝,花名朴灵,致力于NodeJS和Mobile Web App方面的研发工作。EventProxy 仅仅是一个很轻量的工具,但是能够带来一种事件式编程的思维变化。有以下几个特点:
1.利用事件机制解耦复杂业务逻辑;
2.移除被广为诟病的深度callback嵌套问题;
3.将串行等待变成并行等待,提升多异步协作场景下的执行效率;
4.友好的Error handling;
5.无平台依赖,适合前后端,能用于浏览器和Node.js;
6.兼容CMD,AMD以及CommonJS模块环境。
二、安装
通过NPM安装即可使用:$ npm install eventproxy
调用:var EventProxy = require(‘eventproxy’);
三、使用
这里只简单介绍EventProxy在node环境中的应用,至于前端及其他环境使用见:https://github.com/JacksonTian/eventproxy。
1.过去异步的I/O操作时,很容易会写成回调函数深度嵌套,如下:
var add= function (v1, v2, v3){
console.log(v1+v2+v3+'');
};
var value1,value2,value3
clinet.get("key1", function (err, data) {
// do something
value1 = data
clinet.get("key2", function (err, data) {
// do something
value2=data
clinet.get("key3", function (err, data) {
//do something
value3 = data
add(value1, value2, value3);
});
});
});
2.使用EventProxy后可以更多关心业务,去掉深度嵌套,并且在一些情况下显著提高效率
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);
});
3.EventProxy在日志分析系统中的应用
以下为日志系统中服务启动加载菜单的程序:
var fs = require('fs'),
EventProxy = require('eventproxy').EventProxy;
exports.loadMenu = function(dir,cb){
var proxy = new EventProxy();
proxy.assign('menus', cb);
fs.readdir(dir, function(err, files) {
var menusTemp = [];
if(err) {
throw new Error(err);
}
files.forEach(function(filename) {
if(filename.substring(filename.length-3) == '.js'){
var filepath = [ dir, filename ].join('/');
var tmp = require(filepath);
for (m in tmp){
menusTemp.push(tmp[m]);
}
}
});
proxy.trigger('menus', menusTemp);
});
}
其中loadMenu是在服务启动是被调用,传入的参数为菜单文件路径、回调函数,程序首先通过 proxy.assign(‘menus’, cb);监听menus,在程序读取完菜单文件后调用 proxy.trigger(‘menus’, menusTemp);触发cb回调函数,参数为menusTemp。