- 插件主要特点:
- 深层嵌套回调函数,以事件模式完全解除了嵌套的问题, 解耦复杂业务逻辑
- 在不同场景里多个异步同时完成时即执行某个函数,且多个异步执行并行执行 不会堵塞
- 提供了before after wait等 特殊场景api ,应用场景更丰富
- 全局监听事件,订阅模式
- 兼容node端 浏览器端
- 遵循umd规范
npm install eventsproxy
const createEventsProxy = require('eventsproxy');
const ep = createEventsProxy();
fetch(url, options).then(function(response) {
{`... 复杂业务 ...`}
ep.emit('Test1', response);
})
ep.register('Test1', (data) => {
{`... 处理data ...`}
})
// 传统模式
fetch(url, options).then(function(response) {
{`... 复杂业务 ...`}
fetch(url, options).then(function(response) {
{`... 复杂业务 ...`}
fetch(url, options).then(function(response) {
{`... 复杂业务 ...`}
console.log('finshied');
})
})
})
// EventsProxy 模式
const createEventsProxy = require('eventsproxy');
const ep = createEventsProxy();
fetch(url, options).then(function(response) {
{`... 复杂业务 ...`}
ep.emit('Task1', data);
})
fetch(url, options).then(function(response) {
{`... 复杂业务 ...`}
ep.emit('Task2', data);
})
fetch(url, options).then(function(response) {
{`... 复杂业务 ...`}
ep.emit('Task3', data);
})
ep.register(['Task1', 'Task1', 'Task3'], (data1, data2, data3) => {
console.log('finshied', data1, data2, data3);
})
const createEventsProxy = require('eventsproxy');
const ep = createEventsProxy();
fetch(url, options).then(function(response) {
{`... 复杂业务 ...`}
ep.emit('Test1', data);
})
fetch(url, options).then(function(response) {
{`... 复杂业务 ...`}
ep.emit('Test2', data);
})
ep.register({
'Test1': (data) => {
{`... 处理data ...`}
},
'Test2': (data) => {
{`... 处理data ...`}
},
'Test1~Test2': (data1, data2) => {
{`... 处理data ...`}
}
})
const createEventsProxy = require('eventsproxy');
const ep = createEventsProxy();
fetch(url, options).then(function(response) {
{`... 复杂业务 ...`}
ep.emit('Test', 10)
});
const data1 = await ep.await('Test'); // 为了兼容合成事件 resolve返回值 为一个数组
console.log(data); // data = [ 10 ]
fetch(url, options).then(function(response) {
{`... 复杂业务 ...`}
ep.emit('Test1', 10)
});
fetch(url, options).then(function(response) {
{`... 复杂业务 ...`}
ep.emit('Test2', 20)
});
const data2 = await ep.await(['Test1', 'Test2']); // 为了兼容合成事件 resolve返回值 为一个数组
console.log(data); // data = [ 10, 20 ]
const createEventsProxy = require('eventsproxy');
const ep = createEventsProxy();
fetch(url, options).then(function(response) {
{`... 复杂业务 ...`}
ep.emit('Test1', data);
})
fetch(url, options).then(function(response) {
{`... 复杂业务 ...`}
ep.emit('Test2', data);
})
ep.after(['Test1', 'Test2'], (v1, v2) => {
{`... 最后执行的业务 ... `}
})
ep.bind(['Test1', 'Test2'], (v1, v2) => {
{`... 再执行的业务 ... `}
})
ep.before(['Test1', 'Test2'], (v1, v2) => {
{`... 先执行的业务 ... `}
})
const createEventsProxy = require('eventsproxy');
const ep = createEventsProxy();
fetch(url, options).then(function(response) {
{`... 复杂业务 ...`}
ep.done('Test1', data);
})
fetch(url, options).then(function(response) {
{`... 复杂业务 ...`}
ep.done('Test2', data);
})
ep.once(['Test1', 'Test2'], (v1, v2) => {
{`... 只执行一次的业务 ... `}
})
const createEventsProxy = require('eventsproxy');
const ep = createEventsProxy();
const fetch1 = () => {
fetch(url, options).then(function(response) {
{`... 复杂业务 ...`}
ep.emit('Test1', data1);
})
}
const fetch2 = () => {
fetch(url, options).then(function(response) {
{`... 复杂业务 ...`}
ep.emit('Test2', data2);
})
}
fetch1();
fetch2(); //第一次满足条件不会触发
fetch1();
fetch2(); //第二次满足条件才会触发
ep.wait(['Test1', 'Test2'], (v1, v2) => {
{`... 执行的业务 ... `}
{v1 == [data1, data2]} //等于每一层深度的所有data数组
}, 2 /* 等待的深度 */)
const createEventsProxy = require('eventsproxy');
const ep = createEventsProxy();
const fn = (v1, v2) => {
{`... 执行的业务 ... `}
}
fetch(url, options).then(function(response) {
{`... 复杂业务 ...`}
ep.done('Test1', data);
})
fetch(url, options).then(function(response) {
{`... 复杂业务 ...`}
ep.done('Test2', data);
})
ep.register(['Test1', 'Test2'], fn);
ep.unregister(['Test1', 'Test2'], fn); // 取消解绑事件 函数必须指向同一个函数
const unregister = ep.register(['Test1', 'Test2'], fn); //register的返回值也返回了卸载函数
unregister(); // 也可以取消解绑事件
/* ⚠️ : 当event为对象模式 批量绑定 因为存在无限递归情况 不返回卸载函数 卸载需要通过 ep.unregister ep.unbind 等主动卸载方式卸载 */
// 引入方式
const createEventsProxy = require('eventsproxy');
const ep2 = createEventsProxy(['Task1', 'Task2'], () => {}); // 快捷方式注册事件
const ep = createEventsProxy();
// 注册事件 三种方式
ep.register('Task', (data) => {
// 字符串单事件注册
});
ep.bind('Task', () => {}); // register alias
ep.on('Task', () => {}); // register alias
ep.subscribe('Task', () => {}); // register alias
ep.register(['Task1', 'Task2'], (v1, v2) => {
// 数组复合事件 回调函数 参数 v1 v2分别是自Task1 Task2传递来的data
}) ;
ep.register({
'Task1': (data) => {},
'Task2': (data) => {},
'Task1,Task2': (v1, v2) => {
// 对象批量注册事件 对象事件注册复合事件key的分割线,默认是 ‘,’
}
});
// 卸载事件
const fn = (v1, v2) => {}
const unregister = ep.register(['Test1', 'Test2'], fn) ;
unregister();// 注册返回值是一个卸载函数
ep.unregister(['Test1', 'Test2'], fn); // 也可以主动卸载事件
ep.unbind(['Test1', 'Test2'], fn);
ep.unsubscribe(['Test1', 'Test2'], fn);
ep.off(['Test1', 'Test2'], fn); // unregister alias
// 设置对象事件注册复合事件key的分割线,默认是 ‘,’ 该注册复合事件的方式只在对象注册事件有效
ep.setProxyLoopSplit('~');
ep.register({
'Task1~Task2': (v1, v2) => {
// 对象批量注册事件 对象事件注册复合事件key的分割线,默认是 ‘,’
}
})
ep.async('Test1') // 异步监听 事件
ep.async(['Test1', 'Test2']) // 异步监听 合成事件
// 总是执行事件之前 以及 之后的钩子
ep.before(['Test1', 'Test2'], () => {});
ep.after(['Test1', 'Test2'], () => {});
// 触发次数执行
ep.after(['Test1', 'Test2'], () => {}, 3 /* waitcount */); // 需要触发3次才会执行回调函数
// 触发事件
ep.emit('Task', data);
ep.done('Task', data); // emit alias