ren-framework
Version:
72 lines (67 loc) • 1.78 kB
JavaScript
const events = require('../events');
const InvalidParamError = require('../errors/InvalidParamError');
const asyncHelper = require('../helpers/async');
/**
* 事件
* @author Verdient。
*/
class Event
{
/**
* 事件挂载
* @param {String} className 类名称
* @param {String} event 事件名称
* @param {Callable} handler 处理器
* @throws {InvalidParamError}
* @author Verdient。
*/
static on(className, event, handler){
if(typeof handler !== 'function'){
throw new InvalidParamError('handler must be callable');
}
if(!events[className]){
events[className] = {};
}
if(!events[className][event]){
events[className][event] = [];
}
events[className][event].push(handler);
}
/**
* 事件移除
* @param {String} className 类名称
* @param {String} event 事件名称
* @param {Callable} handler 处理器
* @author Verdient。
*/
static off(className, event, handler){
if(events[className] && events[className][event]){
events[className][event].forEach((value, index) => {
if(value === handler){
delete events[className][event][index];
}
});
}
}
/**
* 触发事件
* @param {String} className 类名称
* @param {String} event 事件名称
* @param {Mixed} params 参数
* @return {Promise}
* @author Verdient。
*/
static trigger(className, event, ...params){
return new Promise((resovle, revoke) => {
if(events[className] && events[className][event]){
asyncHelper.each(events[className][event], (handler, index, callback) => {
Promise.resolve(handler(...params)).then((result) => callback(null, result)).catch(callback);
}).then(() => resovle(...params)).catch(revoke);
}else{
resovle(...params);
}
});
}
}
module.exports = Event;