emitter-pro
Advanced tools
+1
-231
| 'use strict'; | ||
| /** | ||
| * 事件触发器,支持浏览器端和 node 端。 | ||
| * | ||
| * @class | ||
| * @example | ||
| * | ||
| * const emitter = new Emitter(); | ||
| * | ||
| * // 注册监听方法 | ||
| * emitter.on('foo', () => console.log('foo 1')); | ||
| * emitter.on('foo', () => console.log('foo 2')); | ||
| * | ||
| * // 触发方法 | ||
| * emitter.emit('foo'); | ||
| * // foo 1 | ||
| * // foo 2 | ||
| * | ||
| * // 取消监听方法 | ||
| * emitter.off('foo'); | ||
| * | ||
| * // 支持链式调用 | ||
| * emitter.on('foo', () => {}) | ||
| * .on('foo', () => {}) | ||
| * .off('foo'); | ||
| */ | ||
| var EmitterPro = /** @class */ (function () { | ||
| var EmitterPro = (function () { | ||
| function EmitterPro() { | ||
| this.handlers = {}; | ||
| } | ||
| /** | ||
| * 获取全部事件名称。 | ||
| * | ||
| * @returns 事件名称数组。 | ||
| * @example | ||
| * emitter.on('foo', () => {}); | ||
| * emitter.on('bar', () => {}); | ||
| * | ||
| * emitter.eventNames(); // ['foo', 'bar'] | ||
| */ | ||
| EmitterPro.prototype.eventNames = function () { | ||
@@ -48,16 +13,2 @@ var _a; | ||
| }; | ||
| /** | ||
| * 获取事件名称的全部监听方法(原始方法,未经过包装处理)。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @returns 对应事件名称的监听方法数组 | ||
| * @example | ||
| * const fn1 = () => console.log('bar'); | ||
| * const fn2 = () => console.log('baz'); | ||
| * | ||
| * emitter.on('test', fn1); | ||
| * emitter.once('test', fn2); | ||
| * | ||
| * emitter.rawListeners('test'); // [fn1, fn2] | ||
| */ | ||
| EmitterPro.prototype.rawListeners = function (eventName) { | ||
@@ -67,16 +18,2 @@ var handler = this.handlers[eventName]; | ||
| }; | ||
| /** | ||
| * 获取事件名称的全部监听方法(如通过 `once` 方法注册,返回的是包装方法)。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @returns 对应事件名称的监听方法数组 | ||
| * @example | ||
| * const fn1 = () => console.log('bar'); | ||
| * const fn2 = () => console.log('baz'); | ||
| * | ||
| * emitter.on('test', fn1); | ||
| * emitter.once('test', fn2); | ||
| * | ||
| * emitter.rawListeners('test'); // [fn1, wrapFn2] | ||
| */ | ||
| EmitterPro.prototype.listeners = function (eventName) { | ||
@@ -86,24 +23,2 @@ var handler = this.handlers[eventName]; | ||
| }; | ||
| /** | ||
| * 判断事件名称对应的监听方法是否存在。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @param listener 监听方法 | ||
| * @returns 如果事件名称存在该事件方法返回 `true`,否则返回 `false`。 | ||
| * @example | ||
| * const fn1 = () => console.log('bar'); | ||
| * const fn2 = () => console.log('baz'); | ||
| * | ||
| * emitter.on('test', fn1); | ||
| * emitter.once('test', fn2); | ||
| * | ||
| * emitter.hasListener('test', fn1); // true | ||
| * emitter.hasListener('test', fn2); // true | ||
| * | ||
| * // fn2 是通过 once 方法注册,执行一次后自动解绑 | ||
| * emitter.emit('test'); | ||
| * | ||
| * emitter.hasListener('test', fn1); // true | ||
| * emitter.hasListener('test', fn2); // false | ||
| */ | ||
| EmitterPro.prototype.hasListener = function (eventName, listener) { | ||
@@ -125,35 +40,5 @@ return this.rawListeners(eventName).some(function (item) { return item === listener; }); | ||
| }; | ||
| /** | ||
| * 注册监听方法。同 `on` 方法,只是将监听方法添加到最前面(事件触发是按顺序执行)。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @param listener 监听方法 | ||
| * @param context 执行上下文 | ||
| * @returns 事件触发器实例。 | ||
| * @example | ||
| * emitter.on('foo', () => console.log('bar')); | ||
| * emitter.prependListener('foo', () => console.log(42)); | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // 42 | ||
| * // bar | ||
| */ | ||
| EmitterPro.prototype.prependListener = function (eventName, listener, context) { | ||
| return this._on(eventName, listener, listener, context, 0); | ||
| }; | ||
| /** | ||
| * 注册监听方法。允许多次添加同一引用的函数。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @param listener 监听方法 | ||
| * @param context 执行上下文 | ||
| * @returns 事件触发器实例。 | ||
| * @example | ||
| * emitter.on('foo', () => console.log('bar')); | ||
| * emitter.on('foo', () => console.log(42)); | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // bar | ||
| * // 42 | ||
| */ | ||
| EmitterPro.prototype.on = function (eventName, listener, context) { | ||
@@ -175,20 +60,2 @@ return this._on(eventName, listener, listener, context); | ||
| }; | ||
| /** | ||
| * 仅触发一次的监听方法。使用方法同 `on` 。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @param listener 监听方法 | ||
| * @param context 执行上下文 | ||
| * @returns 事件触发器实例。 | ||
| * @example | ||
| * emitter.on('foo', () => console.log('bar')); | ||
| * emitter.once('foo', () => console.log(42)); | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // bar | ||
| * // 42 | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // bar | ||
| */ | ||
| EmitterPro.prototype.once = function (eventName, listener, context) { | ||
@@ -198,20 +65,2 @@ var wrap = this._wrapOnce(eventName, listener, context); | ||
| }; | ||
| /** | ||
| * 仅触发一次的监听方法。同 `once` 方法,只是添加到最前面(事件触发是按顺序执行)。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @param listener 监听方法 | ||
| * @param context 执行上下文 | ||
| * @returns 事件触发器实例。 | ||
| * @example | ||
| * emitter.on('foo', () => console.log('bar')); | ||
| * emitter.prependOnceListener('foo', () => console.log(42)); | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // 42 | ||
| * // bar | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // bar | ||
| */ | ||
| EmitterPro.prototype.prependOnceListener = function (eventName, listener, context) { | ||
@@ -221,28 +70,2 @@ var wrap = this._wrapOnce(eventName, listener, context); | ||
| }; | ||
| /** | ||
| * 取消监听方法。如果不传第二个参数,将取消该事件名称的全部监听方法。如果多次添加同一引用的函数,需要多次删除。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @param listener 监听方法 | ||
| * @returns 事件触发器实例。 | ||
| * @example | ||
| * const fn = () => console.log('bar'); | ||
| * emitter.on('foo', fn); | ||
| * emitter.on('foo', () => console.log('baz')); | ||
| * emitter.on('foo', () => console.log(42)); | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // bar | ||
| * // baz | ||
| * // 42 | ||
| * | ||
| * emitter.off('foo', fn); // 取消 foo 的监听方法 fn | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // bar | ||
| * // 42 | ||
| * | ||
| * emitter.off('foo'); // 取消 foo 的全部监听方法 | ||
| * emitter.emit('foo'); // 什么都没发生 | ||
| */ | ||
| EmitterPro.prototype.off = function (eventName, listener) { | ||
@@ -263,29 +86,2 @@ var handler = this.handlers[eventName]; | ||
| }; | ||
| /** | ||
| * 取消全部事件名称的监听方法。 | ||
| * | ||
| * @returns 事件触发器实例。 | ||
| * @example | ||
| * const fn = () => console.log('bar'); | ||
| * emitter.on('test', fn); | ||
| * emitter.on('test', () => console.log('baz')); | ||
| * emitter.on('test', () => console.log(42)); | ||
| * | ||
| * emitter.on('other', fn); | ||
| * emitter.on('other', () => console.log('baz')); | ||
| * | ||
| * emitter.emit('test'); | ||
| * // bar | ||
| * // baz | ||
| * // 42 | ||
| * | ||
| * emitter.emit('other'); | ||
| * // bar | ||
| * // baz | ||
| * | ||
| * emitter.offAll(); // 取消全部监听方法 | ||
| * | ||
| * emitter.emit('test'); // 什么都没发生 | ||
| * emitter.emit('other'); // 什么都没发生 | ||
| */ | ||
| EmitterPro.prototype.offAll = function () { | ||
@@ -295,28 +91,2 @@ this.handlers = {}; | ||
| }; | ||
| /** | ||
| * 触发监听方法。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @param args 触发监听方法的参数(从第二个参数开始都将传给监听方法) | ||
| * @returns 如果触发成功返回 `true`,否则返回 `false`。 | ||
| * @example | ||
| * emitter.on('foo', () => console.log('bar')); | ||
| * emitter.on('foo', () => console.log(42)); | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // bar | ||
| * // 42 | ||
| * | ||
| * // 支持传入参数 | ||
| * emitter.on('test' (a, b) => console.log(a + b)); | ||
| * emitter.on('test' (a, b) => console.log(a * b)); | ||
| * | ||
| * emitter.emit('other', 2, 5); | ||
| * // 7 | ||
| * // 10 | ||
| * | ||
| * emitter.emit('other', 5, 5); | ||
| * // 10 | ||
| * // 25 | ||
| */ | ||
| EmitterPro.prototype.emit = function (eventName) { | ||
@@ -323,0 +93,0 @@ var args = []; |
+1
-231
@@ -1,40 +0,5 @@ | ||
| /** | ||
| * 事件触发器,支持浏览器端和 node 端。 | ||
| * | ||
| * @class | ||
| * @example | ||
| * | ||
| * const emitter = new Emitter(); | ||
| * | ||
| * // 注册监听方法 | ||
| * emitter.on('foo', () => console.log('foo 1')); | ||
| * emitter.on('foo', () => console.log('foo 2')); | ||
| * | ||
| * // 触发方法 | ||
| * emitter.emit('foo'); | ||
| * // foo 1 | ||
| * // foo 2 | ||
| * | ||
| * // 取消监听方法 | ||
| * emitter.off('foo'); | ||
| * | ||
| * // 支持链式调用 | ||
| * emitter.on('foo', () => {}) | ||
| * .on('foo', () => {}) | ||
| * .off('foo'); | ||
| */ | ||
| var EmitterPro = /** @class */ (function () { | ||
| var EmitterPro = (function () { | ||
| function EmitterPro() { | ||
| this.handlers = {}; | ||
| } | ||
| /** | ||
| * 获取全部事件名称。 | ||
| * | ||
| * @returns 事件名称数组。 | ||
| * @example | ||
| * emitter.on('foo', () => {}); | ||
| * emitter.on('bar', () => {}); | ||
| * | ||
| * emitter.eventNames(); // ['foo', 'bar'] | ||
| */ | ||
| EmitterPro.prototype.eventNames = function () { | ||
@@ -46,16 +11,2 @@ var _a; | ||
| }; | ||
| /** | ||
| * 获取事件名称的全部监听方法(原始方法,未经过包装处理)。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @returns 对应事件名称的监听方法数组 | ||
| * @example | ||
| * const fn1 = () => console.log('bar'); | ||
| * const fn2 = () => console.log('baz'); | ||
| * | ||
| * emitter.on('test', fn1); | ||
| * emitter.once('test', fn2); | ||
| * | ||
| * emitter.rawListeners('test'); // [fn1, fn2] | ||
| */ | ||
| EmitterPro.prototype.rawListeners = function (eventName) { | ||
@@ -65,16 +16,2 @@ var handler = this.handlers[eventName]; | ||
| }; | ||
| /** | ||
| * 获取事件名称的全部监听方法(如通过 `once` 方法注册,返回的是包装方法)。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @returns 对应事件名称的监听方法数组 | ||
| * @example | ||
| * const fn1 = () => console.log('bar'); | ||
| * const fn2 = () => console.log('baz'); | ||
| * | ||
| * emitter.on('test', fn1); | ||
| * emitter.once('test', fn2); | ||
| * | ||
| * emitter.rawListeners('test'); // [fn1, wrapFn2] | ||
| */ | ||
| EmitterPro.prototype.listeners = function (eventName) { | ||
@@ -84,24 +21,2 @@ var handler = this.handlers[eventName]; | ||
| }; | ||
| /** | ||
| * 判断事件名称对应的监听方法是否存在。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @param listener 监听方法 | ||
| * @returns 如果事件名称存在该事件方法返回 `true`,否则返回 `false`。 | ||
| * @example | ||
| * const fn1 = () => console.log('bar'); | ||
| * const fn2 = () => console.log('baz'); | ||
| * | ||
| * emitter.on('test', fn1); | ||
| * emitter.once('test', fn2); | ||
| * | ||
| * emitter.hasListener('test', fn1); // true | ||
| * emitter.hasListener('test', fn2); // true | ||
| * | ||
| * // fn2 是通过 once 方法注册,执行一次后自动解绑 | ||
| * emitter.emit('test'); | ||
| * | ||
| * emitter.hasListener('test', fn1); // true | ||
| * emitter.hasListener('test', fn2); // false | ||
| */ | ||
| EmitterPro.prototype.hasListener = function (eventName, listener) { | ||
@@ -123,35 +38,5 @@ return this.rawListeners(eventName).some(function (item) { return item === listener; }); | ||
| }; | ||
| /** | ||
| * 注册监听方法。同 `on` 方法,只是将监听方法添加到最前面(事件触发是按顺序执行)。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @param listener 监听方法 | ||
| * @param context 执行上下文 | ||
| * @returns 事件触发器实例。 | ||
| * @example | ||
| * emitter.on('foo', () => console.log('bar')); | ||
| * emitter.prependListener('foo', () => console.log(42)); | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // 42 | ||
| * // bar | ||
| */ | ||
| EmitterPro.prototype.prependListener = function (eventName, listener, context) { | ||
| return this._on(eventName, listener, listener, context, 0); | ||
| }; | ||
| /** | ||
| * 注册监听方法。允许多次添加同一引用的函数。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @param listener 监听方法 | ||
| * @param context 执行上下文 | ||
| * @returns 事件触发器实例。 | ||
| * @example | ||
| * emitter.on('foo', () => console.log('bar')); | ||
| * emitter.on('foo', () => console.log(42)); | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // bar | ||
| * // 42 | ||
| */ | ||
| EmitterPro.prototype.on = function (eventName, listener, context) { | ||
@@ -173,20 +58,2 @@ return this._on(eventName, listener, listener, context); | ||
| }; | ||
| /** | ||
| * 仅触发一次的监听方法。使用方法同 `on` 。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @param listener 监听方法 | ||
| * @param context 执行上下文 | ||
| * @returns 事件触发器实例。 | ||
| * @example | ||
| * emitter.on('foo', () => console.log('bar')); | ||
| * emitter.once('foo', () => console.log(42)); | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // bar | ||
| * // 42 | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // bar | ||
| */ | ||
| EmitterPro.prototype.once = function (eventName, listener, context) { | ||
@@ -196,20 +63,2 @@ var wrap = this._wrapOnce(eventName, listener, context); | ||
| }; | ||
| /** | ||
| * 仅触发一次的监听方法。同 `once` 方法,只是添加到最前面(事件触发是按顺序执行)。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @param listener 监听方法 | ||
| * @param context 执行上下文 | ||
| * @returns 事件触发器实例。 | ||
| * @example | ||
| * emitter.on('foo', () => console.log('bar')); | ||
| * emitter.prependOnceListener('foo', () => console.log(42)); | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // 42 | ||
| * // bar | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // bar | ||
| */ | ||
| EmitterPro.prototype.prependOnceListener = function (eventName, listener, context) { | ||
@@ -219,28 +68,2 @@ var wrap = this._wrapOnce(eventName, listener, context); | ||
| }; | ||
| /** | ||
| * 取消监听方法。如果不传第二个参数,将取消该事件名称的全部监听方法。如果多次添加同一引用的函数,需要多次删除。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @param listener 监听方法 | ||
| * @returns 事件触发器实例。 | ||
| * @example | ||
| * const fn = () => console.log('bar'); | ||
| * emitter.on('foo', fn); | ||
| * emitter.on('foo', () => console.log('baz')); | ||
| * emitter.on('foo', () => console.log(42)); | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // bar | ||
| * // baz | ||
| * // 42 | ||
| * | ||
| * emitter.off('foo', fn); // 取消 foo 的监听方法 fn | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // bar | ||
| * // 42 | ||
| * | ||
| * emitter.off('foo'); // 取消 foo 的全部监听方法 | ||
| * emitter.emit('foo'); // 什么都没发生 | ||
| */ | ||
| EmitterPro.prototype.off = function (eventName, listener) { | ||
@@ -261,29 +84,2 @@ var handler = this.handlers[eventName]; | ||
| }; | ||
| /** | ||
| * 取消全部事件名称的监听方法。 | ||
| * | ||
| * @returns 事件触发器实例。 | ||
| * @example | ||
| * const fn = () => console.log('bar'); | ||
| * emitter.on('test', fn); | ||
| * emitter.on('test', () => console.log('baz')); | ||
| * emitter.on('test', () => console.log(42)); | ||
| * | ||
| * emitter.on('other', fn); | ||
| * emitter.on('other', () => console.log('baz')); | ||
| * | ||
| * emitter.emit('test'); | ||
| * // bar | ||
| * // baz | ||
| * // 42 | ||
| * | ||
| * emitter.emit('other'); | ||
| * // bar | ||
| * // baz | ||
| * | ||
| * emitter.offAll(); // 取消全部监听方法 | ||
| * | ||
| * emitter.emit('test'); // 什么都没发生 | ||
| * emitter.emit('other'); // 什么都没发生 | ||
| */ | ||
| EmitterPro.prototype.offAll = function () { | ||
@@ -293,28 +89,2 @@ this.handlers = {}; | ||
| }; | ||
| /** | ||
| * 触发监听方法。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @param args 触发监听方法的参数(从第二个参数开始都将传给监听方法) | ||
| * @returns 如果触发成功返回 `true`,否则返回 `false`。 | ||
| * @example | ||
| * emitter.on('foo', () => console.log('bar')); | ||
| * emitter.on('foo', () => console.log(42)); | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // bar | ||
| * // 42 | ||
| * | ||
| * // 支持传入参数 | ||
| * emitter.on('test' (a, b) => console.log(a + b)); | ||
| * emitter.on('test' (a, b) => console.log(a * b)); | ||
| * | ||
| * emitter.emit('other', 2, 5); | ||
| * // 7 | ||
| * // 10 | ||
| * | ||
| * emitter.emit('other', 5, 5); | ||
| * // 10 | ||
| * // 25 | ||
| */ | ||
| EmitterPro.prototype.emit = function (eventName) { | ||
@@ -321,0 +91,0 @@ var args = []; |
+1
-231
@@ -7,41 +7,6 @@ (function (global, factory) { | ||
| /** | ||
| * 事件触发器,支持浏览器端和 node 端。 | ||
| * | ||
| * @class | ||
| * @example | ||
| * | ||
| * const emitter = new Emitter(); | ||
| * | ||
| * // 注册监听方法 | ||
| * emitter.on('foo', () => console.log('foo 1')); | ||
| * emitter.on('foo', () => console.log('foo 2')); | ||
| * | ||
| * // 触发方法 | ||
| * emitter.emit('foo'); | ||
| * // foo 1 | ||
| * // foo 2 | ||
| * | ||
| * // 取消监听方法 | ||
| * emitter.off('foo'); | ||
| * | ||
| * // 支持链式调用 | ||
| * emitter.on('foo', () => {}) | ||
| * .on('foo', () => {}) | ||
| * .off('foo'); | ||
| */ | ||
| var EmitterPro = /** @class */ (function () { | ||
| var EmitterPro = (function () { | ||
| function EmitterPro() { | ||
| this.handlers = {}; | ||
| } | ||
| /** | ||
| * 获取全部事件名称。 | ||
| * | ||
| * @returns 事件名称数组。 | ||
| * @example | ||
| * emitter.on('foo', () => {}); | ||
| * emitter.on('bar', () => {}); | ||
| * | ||
| * emitter.eventNames(); // ['foo', 'bar'] | ||
| */ | ||
| EmitterPro.prototype.eventNames = function () { | ||
@@ -53,16 +18,2 @@ var _a; | ||
| }; | ||
| /** | ||
| * 获取事件名称的全部监听方法(原始方法,未经过包装处理)。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @returns 对应事件名称的监听方法数组 | ||
| * @example | ||
| * const fn1 = () => console.log('bar'); | ||
| * const fn2 = () => console.log('baz'); | ||
| * | ||
| * emitter.on('test', fn1); | ||
| * emitter.once('test', fn2); | ||
| * | ||
| * emitter.rawListeners('test'); // [fn1, fn2] | ||
| */ | ||
| EmitterPro.prototype.rawListeners = function (eventName) { | ||
@@ -72,16 +23,2 @@ var handler = this.handlers[eventName]; | ||
| }; | ||
| /** | ||
| * 获取事件名称的全部监听方法(如通过 `once` 方法注册,返回的是包装方法)。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @returns 对应事件名称的监听方法数组 | ||
| * @example | ||
| * const fn1 = () => console.log('bar'); | ||
| * const fn2 = () => console.log('baz'); | ||
| * | ||
| * emitter.on('test', fn1); | ||
| * emitter.once('test', fn2); | ||
| * | ||
| * emitter.rawListeners('test'); // [fn1, wrapFn2] | ||
| */ | ||
| EmitterPro.prototype.listeners = function (eventName) { | ||
@@ -91,24 +28,2 @@ var handler = this.handlers[eventName]; | ||
| }; | ||
| /** | ||
| * 判断事件名称对应的监听方法是否存在。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @param listener 监听方法 | ||
| * @returns 如果事件名称存在该事件方法返回 `true`,否则返回 `false`。 | ||
| * @example | ||
| * const fn1 = () => console.log('bar'); | ||
| * const fn2 = () => console.log('baz'); | ||
| * | ||
| * emitter.on('test', fn1); | ||
| * emitter.once('test', fn2); | ||
| * | ||
| * emitter.hasListener('test', fn1); // true | ||
| * emitter.hasListener('test', fn2); // true | ||
| * | ||
| * // fn2 是通过 once 方法注册,执行一次后自动解绑 | ||
| * emitter.emit('test'); | ||
| * | ||
| * emitter.hasListener('test', fn1); // true | ||
| * emitter.hasListener('test', fn2); // false | ||
| */ | ||
| EmitterPro.prototype.hasListener = function (eventName, listener) { | ||
@@ -130,35 +45,5 @@ return this.rawListeners(eventName).some(function (item) { return item === listener; }); | ||
| }; | ||
| /** | ||
| * 注册监听方法。同 `on` 方法,只是将监听方法添加到最前面(事件触发是按顺序执行)。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @param listener 监听方法 | ||
| * @param context 执行上下文 | ||
| * @returns 事件触发器实例。 | ||
| * @example | ||
| * emitter.on('foo', () => console.log('bar')); | ||
| * emitter.prependListener('foo', () => console.log(42)); | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // 42 | ||
| * // bar | ||
| */ | ||
| EmitterPro.prototype.prependListener = function (eventName, listener, context) { | ||
| return this._on(eventName, listener, listener, context, 0); | ||
| }; | ||
| /** | ||
| * 注册监听方法。允许多次添加同一引用的函数。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @param listener 监听方法 | ||
| * @param context 执行上下文 | ||
| * @returns 事件触发器实例。 | ||
| * @example | ||
| * emitter.on('foo', () => console.log('bar')); | ||
| * emitter.on('foo', () => console.log(42)); | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // bar | ||
| * // 42 | ||
| */ | ||
| EmitterPro.prototype.on = function (eventName, listener, context) { | ||
@@ -180,20 +65,2 @@ return this._on(eventName, listener, listener, context); | ||
| }; | ||
| /** | ||
| * 仅触发一次的监听方法。使用方法同 `on` 。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @param listener 监听方法 | ||
| * @param context 执行上下文 | ||
| * @returns 事件触发器实例。 | ||
| * @example | ||
| * emitter.on('foo', () => console.log('bar')); | ||
| * emitter.once('foo', () => console.log(42)); | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // bar | ||
| * // 42 | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // bar | ||
| */ | ||
| EmitterPro.prototype.once = function (eventName, listener, context) { | ||
@@ -203,20 +70,2 @@ var wrap = this._wrapOnce(eventName, listener, context); | ||
| }; | ||
| /** | ||
| * 仅触发一次的监听方法。同 `once` 方法,只是添加到最前面(事件触发是按顺序执行)。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @param listener 监听方法 | ||
| * @param context 执行上下文 | ||
| * @returns 事件触发器实例。 | ||
| * @example | ||
| * emitter.on('foo', () => console.log('bar')); | ||
| * emitter.prependOnceListener('foo', () => console.log(42)); | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // 42 | ||
| * // bar | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // bar | ||
| */ | ||
| EmitterPro.prototype.prependOnceListener = function (eventName, listener, context) { | ||
@@ -226,28 +75,2 @@ var wrap = this._wrapOnce(eventName, listener, context); | ||
| }; | ||
| /** | ||
| * 取消监听方法。如果不传第二个参数,将取消该事件名称的全部监听方法。如果多次添加同一引用的函数,需要多次删除。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @param listener 监听方法 | ||
| * @returns 事件触发器实例。 | ||
| * @example | ||
| * const fn = () => console.log('bar'); | ||
| * emitter.on('foo', fn); | ||
| * emitter.on('foo', () => console.log('baz')); | ||
| * emitter.on('foo', () => console.log(42)); | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // bar | ||
| * // baz | ||
| * // 42 | ||
| * | ||
| * emitter.off('foo', fn); // 取消 foo 的监听方法 fn | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // bar | ||
| * // 42 | ||
| * | ||
| * emitter.off('foo'); // 取消 foo 的全部监听方法 | ||
| * emitter.emit('foo'); // 什么都没发生 | ||
| */ | ||
| EmitterPro.prototype.off = function (eventName, listener) { | ||
@@ -268,29 +91,2 @@ var handler = this.handlers[eventName]; | ||
| }; | ||
| /** | ||
| * 取消全部事件名称的监听方法。 | ||
| * | ||
| * @returns 事件触发器实例。 | ||
| * @example | ||
| * const fn = () => console.log('bar'); | ||
| * emitter.on('test', fn); | ||
| * emitter.on('test', () => console.log('baz')); | ||
| * emitter.on('test', () => console.log(42)); | ||
| * | ||
| * emitter.on('other', fn); | ||
| * emitter.on('other', () => console.log('baz')); | ||
| * | ||
| * emitter.emit('test'); | ||
| * // bar | ||
| * // baz | ||
| * // 42 | ||
| * | ||
| * emitter.emit('other'); | ||
| * // bar | ||
| * // baz | ||
| * | ||
| * emitter.offAll(); // 取消全部监听方法 | ||
| * | ||
| * emitter.emit('test'); // 什么都没发生 | ||
| * emitter.emit('other'); // 什么都没发生 | ||
| */ | ||
| EmitterPro.prototype.offAll = function () { | ||
@@ -300,28 +96,2 @@ this.handlers = {}; | ||
| }; | ||
| /** | ||
| * 触发监听方法。 | ||
| * | ||
| * @param eventName 事件名称 | ||
| * @param args 触发监听方法的参数(从第二个参数开始都将传给监听方法) | ||
| * @returns 如果触发成功返回 `true`,否则返回 `false`。 | ||
| * @example | ||
| * emitter.on('foo', () => console.log('bar')); | ||
| * emitter.on('foo', () => console.log(42)); | ||
| * | ||
| * emitter.emit('foo'); | ||
| * // bar | ||
| * // 42 | ||
| * | ||
| * // 支持传入参数 | ||
| * emitter.on('test' (a, b) => console.log(a + b)); | ||
| * emitter.on('test' (a, b) => console.log(a * b)); | ||
| * | ||
| * emitter.emit('other', 2, 5); | ||
| * // 7 | ||
| * // 10 | ||
| * | ||
| * emitter.emit('other', 5, 5); | ||
| * // 10 | ||
| * // 25 | ||
| */ | ||
| EmitterPro.prototype.emit = function (eventName) { | ||
@@ -328,0 +98,0 @@ var args = []; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"emitter-pro.js","sources":["../src/index.ts"],"sourcesContent":["type Listener = (...args: any[]) => any;\n\ntype EventName = string | symbol;\ntype EventListener<F extends Listener = Listener> = { raw: F; wrap: F; context: object | null };\ntype Handler<F extends Listener = Listener> = Record<EventName, EventListener<F>[]>;\n\n/**\n * 事件触发器,支持浏览器端和 node 端。\n *\n * @class\n * @example\n *\n * const emitter = new Emitter();\n *\n * // 注册监听方法\n * emitter.on('foo', () => console.log('foo 1'));\n * emitter.on('foo', () => console.log('foo 2'));\n *\n * // 触发方法\n * emitter.emit('foo');\n * // foo 1\n * // foo 2\n *\n * // 取消监听方法\n * emitter.off('foo');\n *\n * // 支持链式调用\n * emitter.on('foo', () => {})\n * .on('foo', () => {})\n * .off('foo');\n */\nclass EmitterPro<F extends Listener = Listener> {\n private handlers: Handler<F>;\n constructor() {\n this.handlers = {};\n }\n\n /**\n * 获取全部事件名称。\n *\n * @returns 事件名称数组。\n * @example\n * emitter.on('foo', () => {});\n * emitter.on('bar', () => {});\n *\n * emitter.eventNames(); // ['foo', 'bar']\n */\n eventNames() {\n const symbols = Object.getOwnPropertySymbols?.(this.handlers) || [];\n const keys = Object.keys(this.handlers) as (string | symbol)[];\n return keys.concat(symbols);\n }\n\n /**\n * 获取事件名称的全部监听方法(原始方法,未经过包装处理)。\n *\n * @param eventName 事件名称\n * @returns 对应事件名称的监听方法数组\n * @example\n * const fn1 = () => console.log('bar');\n * const fn2 = () => console.log('baz');\n *\n * emitter.on('test', fn1);\n * emitter.once('test', fn2);\n *\n * emitter.rawListeners('test'); // [fn1, fn2]\n */\n rawListeners(eventName: EventName) {\n const handler = this.handlers[eventName];\n return handler ? handler.map((item) => item.raw) : [];\n }\n\n /**\n * 获取事件名称的全部监听方法(如通过 `once` 方法注册,返回的是包装方法)。\n *\n * @param eventName 事件名称\n * @returns 对应事件名称的监听方法数组\n * @example\n * const fn1 = () => console.log('bar');\n * const fn2 = () => console.log('baz');\n *\n * emitter.on('test', fn1);\n * emitter.once('test', fn2);\n *\n * emitter.rawListeners('test'); // [fn1, wrapFn2]\n */\n listeners(eventName: EventName) {\n const handler = this.handlers[eventName];\n return handler ? handler.map((item) => item.wrap) : [];\n }\n\n /**\n * 判断事件名称对应的监听方法是否存在。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @returns 如果事件名称存在该事件方法返回 `true`,否则返回 `false`。\n * @example\n * const fn1 = () => console.log('bar');\n * const fn2 = () => console.log('baz');\n *\n * emitter.on('test', fn1);\n * emitter.once('test', fn2);\n *\n * emitter.hasListener('test', fn1); // true\n * emitter.hasListener('test', fn2); // true\n *\n * // fn2 是通过 once 方法注册,执行一次后自动解绑\n * emitter.emit('test');\n *\n * emitter.hasListener('test', fn1); // true\n * emitter.hasListener('test', fn2); // false\n */\n hasListener(eventName: EventName, listener: F) {\n return this.rawListeners(eventName).some((item) => item === listener);\n }\n\n private _on(\n eventName: EventName,\n raw: F,\n wrap: F,\n context: EventListener['context'] = null,\n dir = 1\n ) {\n const currentListener = { raw, wrap, context };\n\n if (!this.handlers[eventName]) {\n this.handlers[eventName] = [currentListener];\n } else {\n const appendMethod = dir === 1 ? 'push' : 'unshift';\n this.handlers[eventName][appendMethod](currentListener);\n }\n\n return this;\n }\n\n /**\n * 注册监听方法。同 `on` 方法,只是将监听方法添加到最前面(事件触发是按顺序执行)。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.prependListener('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // 42\n * // bar\n */\n prependListener(eventName: EventName, listener: F, context?: EventListener['context']) {\n return this._on(eventName, listener, listener, context, 0);\n }\n\n /**\n * 注册监听方法。允许多次添加同一引用的函数。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.on('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n */\n on(eventName: EventName, listener: F, context?: EventListener['context']) {\n return this._on(eventName, listener, listener, context);\n }\n\n private _wrapOnce(eventName: EventName, listener: F, context: EventListener['context'] = null) {\n const wrap = ((...args: Parameters<F>) => {\n listener.apply(context, args);\n this.off(eventName, wrap);\n }) as F;\n return wrap;\n }\n\n /**\n * 仅触发一次的监听方法。使用方法同 `on` 。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.once('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n *\n * emitter.emit('foo');\n * // bar\n */\n once(eventName: EventName, listener: F, context?: EventListener['context']) {\n const wrap = this._wrapOnce(eventName, listener, context);\n return this._on(eventName, listener, wrap, context);\n }\n\n /**\n * 仅触发一次的监听方法。同 `once` 方法,只是添加到最前面(事件触发是按顺序执行)。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.prependOnceListener('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // 42\n * // bar\n *\n * emitter.emit('foo');\n * // bar\n */\n prependOnceListener(eventName: EventName, listener: F, context?: EventListener['context']) {\n const wrap = this._wrapOnce(eventName, listener, context);\n return this._on(eventName, listener, wrap, context, 0);\n }\n\n /**\n * 取消监听方法。如果不传第二个参数,将取消该事件名称的全部监听方法。如果多次添加同一引用的函数,需要多次删除。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @returns 事件触发器实例。\n * @example\n * const fn = () => console.log('bar');\n * emitter.on('foo', fn);\n * emitter.on('foo', () => console.log('baz'));\n * emitter.on('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // baz\n * // 42\n *\n * emitter.off('foo', fn); // 取消 foo 的监听方法 fn\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n *\n * emitter.off('foo'); // 取消 foo 的全部监听方法\n * emitter.emit('foo'); // 什么都没发生\n */\n off(eventName: EventName, listener?: F) {\n const handler = this.handlers[eventName];\n\n if (handler) {\n if (listener) {\n const index = handler.findIndex((item) => item.wrap === listener || item.raw === listener);\n if (index !== -1) {\n handler.splice(index, 1);\n }\n } else {\n delete this.handlers[eventName];\n }\n }\n return this;\n }\n\n /**\n * 取消全部事件名称的监听方法。\n *\n * @returns 事件触发器实例。\n * @example\n * const fn = () => console.log('bar');\n * emitter.on('test', fn);\n * emitter.on('test', () => console.log('baz'));\n * emitter.on('test', () => console.log(42));\n *\n * emitter.on('other', fn);\n * emitter.on('other', () => console.log('baz'));\n *\n * emitter.emit('test');\n * // bar\n * // baz\n * // 42\n *\n * emitter.emit('other');\n * // bar\n * // baz\n *\n * emitter.offAll(); // 取消全部监听方法\n *\n * emitter.emit('test'); // 什么都没发生\n * emitter.emit('other'); // 什么都没发生\n */\n offAll() {\n this.handlers = {};\n return this;\n }\n\n /**\n * 触发监听方法。\n *\n * @param eventName 事件名称\n * @param args 触发监听方法的参数(从第二个参数开始都将传给监听方法)\n * @returns 如果触发成功返回 `true`,否则返回 `false`。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.on('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n *\n * // 支持传入参数\n * emitter.on('test' (a, b) => console.log(a + b));\n * emitter.on('test' (a, b) => console.log(a * b));\n *\n * emitter.emit('other', 2, 5);\n * // 7\n * // 10\n *\n * emitter.emit('other', 5, 5);\n * // 10\n * // 25\n */\n emit(eventName: EventName, ...args: Parameters<F>) {\n const handler = this.handlers[eventName];\n if (handler && handler.length > 0) {\n handler.forEach((listener) => {\n listener.wrap.apply(listener.context, args);\n });\n return true;\n }\n return false;\n }\n}\n\nexport default EmitterPro;\n"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"emitter-pro.js","sources":["../src/index.ts"],"sourcesContent":["type Listener = (...args: any[]) => any;\n\ntype EventName = string | symbol;\ntype EventListener<F extends Listener = Listener> = { raw: F; wrap: F; context: object | null };\ntype Handler<F extends Listener = Listener> = Record<EventName, EventListener<F>[]>;\n\n/**\n * 事件触发器,支持浏览器端和 node 端。\n *\n * @class\n * @example\n *\n * const emitter = new Emitter();\n *\n * // 注册监听方法\n * emitter.on('foo', () => console.log('foo 1'));\n * emitter.on('foo', () => console.log('foo 2'));\n *\n * // 触发方法\n * emitter.emit('foo');\n * // foo 1\n * // foo 2\n *\n * // 取消监听方法\n * emitter.off('foo');\n *\n * // 支持链式调用\n * emitter.on('foo', () => {})\n * .on('foo', () => {})\n * .off('foo');\n */\nclass EmitterPro<F extends Listener = Listener> {\n private handlers: Handler<F>;\n constructor() {\n this.handlers = {};\n }\n\n /**\n * 获取全部事件名称。\n *\n * @returns 事件名称数组。\n * @example\n * emitter.on('foo', () => {});\n * emitter.on('bar', () => {});\n *\n * emitter.eventNames(); // ['foo', 'bar']\n */\n eventNames() {\n const symbols = Object.getOwnPropertySymbols?.(this.handlers) || [];\n const keys = Object.keys(this.handlers) as (string | symbol)[];\n return keys.concat(symbols);\n }\n\n /**\n * 获取事件名称的全部监听方法(原始方法,未经过包装处理)。\n *\n * @param eventName 事件名称\n * @returns 对应事件名称的监听方法数组\n * @example\n * const fn1 = () => console.log('bar');\n * const fn2 = () => console.log('baz');\n *\n * emitter.on('test', fn1);\n * emitter.once('test', fn2);\n *\n * emitter.rawListeners('test'); // [fn1, fn2]\n */\n rawListeners(eventName: EventName) {\n const handler = this.handlers[eventName];\n return handler ? handler.map((item) => item.raw) : [];\n }\n\n /**\n * 获取事件名称的全部监听方法(如通过 `once` 方法注册,返回的是包装方法)。\n *\n * @param eventName 事件名称\n * @returns 对应事件名称的监听方法数组\n * @example\n * const fn1 = () => console.log('bar');\n * const fn2 = () => console.log('baz');\n *\n * emitter.on('test', fn1);\n * emitter.once('test', fn2);\n *\n * emitter.rawListeners('test'); // [fn1, wrapFn2]\n */\n listeners(eventName: EventName) {\n const handler = this.handlers[eventName];\n return handler ? handler.map((item) => item.wrap) : [];\n }\n\n /**\n * 判断事件名称对应的监听方法是否存在。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @returns 如果事件名称存在该事件方法返回 `true`,否则返回 `false`。\n * @example\n * const fn1 = () => console.log('bar');\n * const fn2 = () => console.log('baz');\n *\n * emitter.on('test', fn1);\n * emitter.once('test', fn2);\n *\n * emitter.hasListener('test', fn1); // true\n * emitter.hasListener('test', fn2); // true\n *\n * // fn2 是通过 once 方法注册,执行一次后自动解绑\n * emitter.emit('test');\n *\n * emitter.hasListener('test', fn1); // true\n * emitter.hasListener('test', fn2); // false\n */\n hasListener(eventName: EventName, listener: F) {\n return this.rawListeners(eventName).some((item) => item === listener);\n }\n\n private _on(\n eventName: EventName,\n raw: F,\n wrap: F,\n context: EventListener['context'] = null,\n dir = 1\n ) {\n const currentListener = { raw, wrap, context };\n\n if (!this.handlers[eventName]) {\n this.handlers[eventName] = [currentListener];\n } else {\n const appendMethod = dir === 1 ? 'push' : 'unshift';\n this.handlers[eventName][appendMethod](currentListener);\n }\n\n return this;\n }\n\n /**\n * 注册监听方法。同 `on` 方法,只是将监听方法添加到最前面(事件触发是按顺序执行)。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.prependListener('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // 42\n * // bar\n */\n prependListener(eventName: EventName, listener: F, context?: EventListener['context']) {\n return this._on(eventName, listener, listener, context, 0);\n }\n\n /**\n * 注册监听方法。允许多次添加同一引用的函数。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.on('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n */\n on(eventName: EventName, listener: F, context?: EventListener['context']) {\n return this._on(eventName, listener, listener, context);\n }\n\n private _wrapOnce(eventName: EventName, listener: F, context: EventListener['context'] = null) {\n const wrap = ((...args: Parameters<F>) => {\n listener.apply(context, args);\n this.off(eventName, wrap);\n }) as F;\n return wrap;\n }\n\n /**\n * 仅触发一次的监听方法。使用方法同 `on` 。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.once('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n *\n * emitter.emit('foo');\n * // bar\n */\n once(eventName: EventName, listener: F, context?: EventListener['context']) {\n const wrap = this._wrapOnce(eventName, listener, context);\n return this._on(eventName, listener, wrap, context);\n }\n\n /**\n * 仅触发一次的监听方法。同 `once` 方法,只是添加到最前面(事件触发是按顺序执行)。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.prependOnceListener('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // 42\n * // bar\n *\n * emitter.emit('foo');\n * // bar\n */\n prependOnceListener(eventName: EventName, listener: F, context?: EventListener['context']) {\n const wrap = this._wrapOnce(eventName, listener, context);\n return this._on(eventName, listener, wrap, context, 0);\n }\n\n /**\n * 取消监听方法。如果不传第二个参数,将取消该事件名称的全部监听方法。如果多次添加同一引用的函数,需要多次删除。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @returns 事件触发器实例。\n * @example\n * const fn = () => console.log('bar');\n * emitter.on('foo', fn);\n * emitter.on('foo', () => console.log('baz'));\n * emitter.on('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // baz\n * // 42\n *\n * emitter.off('foo', fn); // 取消 foo 的监听方法 fn\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n *\n * emitter.off('foo'); // 取消 foo 的全部监听方法\n * emitter.emit('foo'); // 什么都没发生\n */\n off(eventName: EventName, listener?: F) {\n const handler = this.handlers[eventName];\n\n if (handler) {\n if (listener) {\n const index = handler.findIndex((item) => item.wrap === listener || item.raw === listener);\n if (index !== -1) {\n handler.splice(index, 1);\n }\n } else {\n delete this.handlers[eventName];\n }\n }\n return this;\n }\n\n /**\n * 取消全部事件名称的监听方法。\n *\n * @returns 事件触发器实例。\n * @example\n * const fn = () => console.log('bar');\n * emitter.on('test', fn);\n * emitter.on('test', () => console.log('baz'));\n * emitter.on('test', () => console.log(42));\n *\n * emitter.on('other', fn);\n * emitter.on('other', () => console.log('baz'));\n *\n * emitter.emit('test');\n * // bar\n * // baz\n * // 42\n *\n * emitter.emit('other');\n * // bar\n * // baz\n *\n * emitter.offAll(); // 取消全部监听方法\n *\n * emitter.emit('test'); // 什么都没发生\n * emitter.emit('other'); // 什么都没发生\n */\n offAll() {\n this.handlers = {};\n return this;\n }\n\n /**\n * 触发监听方法。\n *\n * @param eventName 事件名称\n * @param args 触发监听方法的参数(从第二个参数开始都将传给监听方法)\n * @returns 如果触发成功返回 `true`,否则返回 `false`。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.on('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n *\n * // 支持传入参数\n * emitter.on('test' (a, b) => console.log(a + b));\n * emitter.on('test' (a, b) => console.log(a * b));\n *\n * emitter.emit('other', 2, 5);\n * // 7\n * // 10\n *\n * emitter.emit('other', 5, 5);\n * // 10\n * // 25\n */\n emit(eventName: EventName, ...args: Parameters<F>) {\n const handler = this.handlers[eventName];\n if (handler && handler.length > 0) {\n handler.forEach((listener) => {\n listener.wrap.apply(listener.context, args);\n });\n return true;\n }\n return false;\n }\n}\n\nexport default EmitterPro;\n"],"names":[],"mappings":"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"} |
+13
-13
| { | ||
| "name": "emitter-pro", | ||
| "version": "1.2.3", | ||
| "version": "1.2.4", | ||
| "description": "一个简单的 Javascript 事件管理,支持浏览器端和 node 端。", | ||
@@ -63,20 +63,20 @@ "scripts": { | ||
| "@commitlint/cz-commitlint": "^19.8.1", | ||
| "@eslint/js": "^9.32.0", | ||
| "@rollup/plugin-commonjs": "^28.0.6", | ||
| "@rollup/plugin-node-resolve": "^16.0.1", | ||
| "@eslint/js": "^9.39.2", | ||
| "@rollup/plugin-commonjs": "^28.0.9", | ||
| "@rollup/plugin-node-resolve": "^16.0.3", | ||
| "@rollup/plugin-terser": "^0.4.4", | ||
| "@rollup/plugin-typescript": "^12.1.4", | ||
| "@rollup/plugin-typescript": "^12.3.0", | ||
| "@types/jest": "^30.0.0", | ||
| "commitizen": "^4.3.1", | ||
| "eslint": "^9.32.0", | ||
| "globals": "^16.3.0", | ||
| "eslint": "^9.39.2", | ||
| "globals": "^16.5.0", | ||
| "husky": "^9.1.7", | ||
| "jest": "^30.0.5", | ||
| "jest": "^30.2.0", | ||
| "lint-staged": "^15.5.2", | ||
| "prettier": "^3.6.2", | ||
| "rollup": "^4.46.0", | ||
| "ts-jest": "^29.4.0", | ||
| "prettier": "^3.8.1", | ||
| "rollup": "^4.57.0", | ||
| "ts-jest": "^29.4.6", | ||
| "tslib": "^2.8.1", | ||
| "typescript": "^5.8.3", | ||
| "typescript-eslint": "^8.38.0" | ||
| "typescript": "^5.9.3", | ||
| "typescript-eslint": "^8.54.0" | ||
| }, | ||
@@ -83,0 +83,0 @@ "publishConfig": { |
57725
-26.69%563
-55.07%