安装eventproxy
npm install eventproxy
EventProxy.js仅仅是一个很轻量的工具,能带来一种事件式编程的思维变化。有几个特点:
1 利用事件机制解耦复杂业务逻辑
2 移除被广为诟病的深度callback嵌套问题
3 将串行等待变成并行等待,提升多异步场景下的执行效率
4 无平台依赖,适合前后端,能用于浏览器和Node.js
nodejs重复请求
在一条sql执行的时间内,如果来了1000条访问请求,那么一次查询结果将返回给1000条请求。
var EventProxy = require('eventproxy');
var proxy = new EventProxy();
var status = "ready";
var select = function(callback){
proxy.once("selected",callback);
if(status == "ready"){
status = "pending";
db.select("SQL", function(results){
proxy.emit("selected",results);
status = "ready";
});
}
}
无深度嵌套的,并行的代码
var proxy = new EventProxy();
var render = function (template, data, l10n){
_.template(template, data);
};
proxy.assign("template", "data", "l10n", render);
$.get("template", function (template) {
// something
proxy.trigger("template", template);
});
$.get("data", function (data) {
// something
proxy.trigger("data", data);
});
$.get("l10n", function (l10n) {
// something
proxy.trigger("l10n", l10n);
});
after
const ep = new EventProxy();
ep.all(['tpl', 'data'], (tpl, data) => {
// 在所有指定的事件触发后,将会被调用执行 参数对应各自的事件名
// 后面的 tpl 和 data 的顺序和前面监听的时间顺序是一样的
});
fs.readFile('template.tpl', 'utf-8', function (err, content) {
ep.emit('tpl', content);
});
db.get('some sql', function (err, result) {
ep.emit('data', result);
});
list 参数是所有的异步结束之后触发事件传递的参数的数组
const ep = new EventProxy();
ep.after('got_file', files.length, (list) => {
// 在所有文件的异步执行结束后将被执行
// 所有文件的内容都存在list数组中
});
for (var i = 0; i {
// 触发结果事件
ep.emit('got_file', content);
});
}
持续型异步协作
此处以股票为例,数据和模版都是异步获取,但是数据会持续刷新,视图会需要重新刷新。
var ep = new EventProxy();
ep.tail('tpl', 'data', function(tpl, data){
//待所有指定的时间都触发后,将第一次回调
//以后再出发其中之一的时间,都会回调
});
fs.readFile('template.tpl', 'utf-8', function(err, content){
ep.emit('tpl', content);
});
setInterval(function(){
db.get('sql', function(err, result){
ep.emit('data', result);
});
}, 2000);