emitter-pro
Advanced tools
+230
-0
| '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 () { | ||
@@ -7,2 +32,12 @@ function EmitterPro() { | ||
| } | ||
| /** | ||
| * 获取全部事件名称。 | ||
| * | ||
| * @returns 事件名称数组。 | ||
| * @example | ||
| * emitter.on('foo', () => {}); | ||
| * emitter.on('bar', () => {}); | ||
| * | ||
| * emitter.eventNames(); // ['foo', 'bar'] | ||
| */ | ||
| EmitterPro.prototype.eventNames = function () { | ||
@@ -14,2 +49,16 @@ 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) { | ||
@@ -19,2 +68,16 @@ 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) { | ||
@@ -24,2 +87,24 @@ 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) { | ||
@@ -41,5 +126,35 @@ 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) { | ||
@@ -61,2 +176,20 @@ 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) { | ||
@@ -66,2 +199,20 @@ 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) { | ||
@@ -71,2 +222,28 @@ 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) { | ||
@@ -87,2 +264,29 @@ 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 () { | ||
@@ -92,2 +296,28 @@ 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) { | ||
@@ -94,0 +324,0 @@ var args = []; |
+230
-0
@@ -0,1 +1,26 @@ | ||
| /** | ||
| * 事件触发器,支持浏览器端和 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 () { | ||
@@ -5,2 +30,12 @@ function EmitterPro() { | ||
| } | ||
| /** | ||
| * 获取全部事件名称。 | ||
| * | ||
| * @returns 事件名称数组。 | ||
| * @example | ||
| * emitter.on('foo', () => {}); | ||
| * emitter.on('bar', () => {}); | ||
| * | ||
| * emitter.eventNames(); // ['foo', 'bar'] | ||
| */ | ||
| EmitterPro.prototype.eventNames = function () { | ||
@@ -12,2 +47,16 @@ 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) { | ||
@@ -17,2 +66,16 @@ 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) { | ||
@@ -22,2 +85,24 @@ 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) { | ||
@@ -39,5 +124,35 @@ 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) { | ||
@@ -59,2 +174,20 @@ 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) { | ||
@@ -64,2 +197,20 @@ 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) { | ||
@@ -69,2 +220,28 @@ 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) { | ||
@@ -85,2 +262,29 @@ 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 () { | ||
@@ -90,2 +294,28 @@ 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) { | ||
@@ -92,0 +322,0 @@ var args = []; |
+230
-0
@@ -7,2 +7,27 @@ (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 () { | ||
@@ -12,2 +37,12 @@ function EmitterPro() { | ||
| } | ||
| /** | ||
| * 获取全部事件名称。 | ||
| * | ||
| * @returns 事件名称数组。 | ||
| * @example | ||
| * emitter.on('foo', () => {}); | ||
| * emitter.on('bar', () => {}); | ||
| * | ||
| * emitter.eventNames(); // ['foo', 'bar'] | ||
| */ | ||
| EmitterPro.prototype.eventNames = function () { | ||
@@ -19,2 +54,16 @@ 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) { | ||
@@ -24,2 +73,16 @@ 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) { | ||
@@ -29,2 +92,24 @@ 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) { | ||
@@ -46,5 +131,35 @@ 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) { | ||
@@ -66,2 +181,20 @@ 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) { | ||
@@ -71,2 +204,20 @@ 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) { | ||
@@ -76,2 +227,28 @@ 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) { | ||
@@ -92,2 +269,29 @@ 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 () { | ||
@@ -97,2 +301,28 @@ 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) { | ||
@@ -99,0 +329,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\nclass EmitterPro<F extends Listener = Listener> {\n private handlers: Handler<F>;\n constructor() {\n this.handlers = {};\n }\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 rawListeners(eventName: EventName) {\n const handler = this.handlers[eventName];\n return handler ? handler.map((item) => item.raw) : [];\n }\n\n listeners(eventName: EventName) {\n const handler = this.handlers[eventName];\n return handler ? handler.map((item) => item.wrap) : [];\n }\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 prependListener(eventName: EventName, listener: F, context?: EventListener['context']) {\n return this._on(eventName, listener, listener, context, 0);\n }\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 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 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 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 offAll() {\n this.handlers = {};\n return this;\n }\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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"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"emitter-pro.min.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\nclass EmitterPro<F extends Listener = Listener> {\n private handlers: Handler<F>;\n constructor() {\n this.handlers = {};\n }\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 rawListeners(eventName: EventName) {\n const handler = this.handlers[eventName];\n return handler ? handler.map((item) => item.raw) : [];\n }\n\n listeners(eventName: EventName) {\n const handler = this.handlers[eventName];\n return handler ? handler.map((item) => item.wrap) : [];\n }\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 prependListener(eventName: EventName, listener: F, context?: EventListener['context']) {\n return this._on(eventName, listener, listener, context, 0);\n }\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 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 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 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 offAll() {\n this.handlers = {};\n return this;\n }\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":["EmitterPro","this","handlers","prototype","eventNames","symbols","_a","Object","getOwnPropertySymbols","call","keys","concat","rawListeners","eventName","handler","map","item","raw","listeners","wrap","hasListener","listener","some","_on","context","dir","currentListener","appendMethod","prependListener","on","_wrapOnce","_this","args","_i","arguments","length","apply","off","once","prependOnceListener","index","findIndex","splice","offAll","emit","forEach"],"mappings":"2OAMA,IAAAA,EAAA,WAEE,SAAAA,IACEC,KAAKC,SAAW,EACjB,CAkGH,OAhGEF,EAAAG,UAAAC,WAAA,iBACQC,GAAyC,QAA/BC,EAAAC,OAAOC,6BAAwB,IAAAF,OAAA,EAAAA,EAAAG,KAAAF,OAAAN,KAAKC,YAAa,GAEjE,OADaK,OAAOG,KAAKT,KAAKC,UAClBS,OAAON,IAGrBL,EAAYG,UAAAS,aAAZ,SAAaC,GACX,IAAMC,EAAUb,KAAKC,SAASW,GAC9B,OAAOC,EAAUA,EAAQC,KAAI,SAACC,GAAS,OAAAA,EAAKC,OAAO,IAGrDjB,EAASG,UAAAe,UAAT,SAAUL,GACR,IAAMC,EAAUb,KAAKC,SAASW,GAC9B,OAAOC,EAAUA,EAAQC,KAAI,SAACC,GAAS,OAAAA,EAAKG,QAAQ,IAGtDnB,EAAAG,UAAAiB,YAAA,SAAYP,EAAsBQ,GAChC,OAAOpB,KAAKW,aAAaC,GAAWS,MAAK,SAACN,GAAS,OAAAA,IAASK,CAAQ,KAG9DrB,EAAGG,UAAAoB,IAAX,SACEV,EACAI,EACAE,EACAK,EACAC,QADA,IAAAD,IAAAA,EAAwC,WACxC,IAAAC,IAAAA,EAAO,GAEP,IAAMC,EAAkB,CAAET,IAAGA,EAAEE,KAAIA,EAAEK,QAAOA,GAE5C,GAAKvB,KAAKC,SAASW,GAEZ,CACL,IAAMc,EAAuB,IAARF,EAAY,OAAS,UAC1CxB,KAAKC,SAASW,GAAWc,GAAcD,EACxC,MAJCzB,KAAKC,SAASW,GAAa,CAACa,GAM9B,OAAOzB,MAGTD,EAAAG,UAAAyB,gBAAA,SAAgBf,EAAsBQ,EAAaG,GACjD,OAAOvB,KAAKsB,IAAIV,EAAWQ,EAAUA,EAAUG,EAAS,IAG1DxB,EAAAG,UAAA0B,GAAA,SAAGhB,EAAsBQ,EAAaG,GACpC,OAAOvB,KAAKsB,IAAIV,EAAWQ,EAAUA,EAAUG,IAGzCxB,EAAAG,UAAA2B,UAAR,SAAkBjB,EAAsBQ,EAAaG,GAArD,IAMCO,EAAA9B,UANoD,IAAAuB,IAAAA,EAAwC,MAC3F,IAAML,EAAI,eAAK,IAAsBa,EAAA,GAAAC,EAAA,EAAtBA,EAAsBC,UAAAC,OAAtBF,IAAAD,EAAsBC,GAAAC,UAAAD,GACnCZ,EAASe,MAAMZ,EAASQ,GACxBD,EAAKM,IAAIxB,EAAWM,EACrB,EACD,OAAOA,GAGTnB,EAAAG,UAAAmC,KAAA,SAAKzB,EAAsBQ,EAAaG,GACtC,IAAML,EAAOlB,KAAK6B,UAAUjB,EAAWQ,EAAUG,GACjD,OAAOvB,KAAKsB,IAAIV,EAAWQ,EAAUF,EAAMK,IAG7CxB,EAAAG,UAAAoC,oBAAA,SAAoB1B,EAAsBQ,EAAaG,GACrD,IAAML,EAAOlB,KAAK6B,UAAUjB,EAAWQ,EAAUG,GACjD,OAAOvB,KAAKsB,IAAIV,EAAWQ,EAAUF,EAAMK,EAAS,IAGtDxB,EAAAG,UAAAkC,IAAA,SAAIxB,EAAsBQ,GACxB,IAAMP,EAAUb,KAAKC,SAASW,GAE9B,GAAIC,EACF,GAAIO,EAAU,CACZ,IAAMmB,EAAQ1B,EAAQ2B,WAAU,SAACzB,GAAS,OAAAA,EAAKG,OAASE,GAAYL,EAAKC,MAAQI,CAAQ,KAC1E,IAAXmB,GACF1B,EAAQ4B,OAAOF,EAAO,EAEzB,aACQvC,KAAKC,SAASW,GAGzB,OAAOZ,MAGTD,EAAAG,UAAAwC,OAAA,WAEE,OADA1C,KAAKC,SAAW,GACTD,MAGTD,EAAIG,UAAAyC,KAAJ,SAAK/B,OAAsB,IAAsBmB,EAAA,GAAAC,EAAA,EAAtBA,EAAsBC,UAAAC,OAAtBF,IAAAD,EAAsBC,EAAA,GAAAC,UAAAD,GAC/C,IAAMnB,EAAUb,KAAKC,SAASW,GAC9B,SAAIC,GAAWA,EAAQqB,OAAS,KAC9BrB,EAAQ+B,SAAQ,SAACxB,GACfA,EAASF,KAAKiB,MAAMf,EAASG,QAASQ,EACxC,KACO,IAIZhC,CAAD"} | ||
| {"version":3,"file":"emitter-pro.min.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":["EmitterPro","this","handlers","prototype","eventNames","symbols","_a","Object","getOwnPropertySymbols","call","keys","concat","rawListeners","eventName","handler","map","item","raw","listeners","wrap","hasListener","listener","some","_on","context","dir","currentListener","appendMethod","prependListener","on","_wrapOnce","_this","args","_i","arguments","length","apply","off","once","prependOnceListener","index","findIndex","splice","offAll","emit","forEach"],"mappings":"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"} |
+1
-1
| { | ||
| "name": "emitter-pro", | ||
| "version": "1.2.1", | ||
| "version": "1.2.2", | ||
| "description": "一个简单的 Javascript 事件管理,支持浏览器端和 node 端。", | ||
@@ -5,0 +5,0 @@ "scripts": { |
+18
-18
@@ -55,7 +55,7 @@ # emitter-pro | ||
| emitter.on('foo', () => console.log('bar')); | ||
| emitter.on('foo', () => console.log('baz')); | ||
| emitter.on('foo', () => console.log(42)); | ||
| emitter.emit('foo'); | ||
| // bar | ||
| // baz | ||
| // 42 | ||
| ``` | ||
@@ -65,3 +65,3 @@ | ||
| 触发方法。 | ||
| 触发监听方法。 | ||
@@ -74,7 +74,7 @@ 返回当前实例。 | ||
| emitter.on('foo', () => console.log('bar')); | ||
| emitter.on('foo', () => console.log('baz')); | ||
| emitter.on('foo', () => console.log(42)); | ||
| emitter.emit('foo'); | ||
| // bar | ||
| // baz | ||
| // 42 | ||
@@ -96,3 +96,3 @@ // 支持传入参数 | ||
| 取消监听方法。如果不传第二个参数,将取消该事件名称的全部监听方法。如果多次添加同一引用的函数,需要多次删除才行。 | ||
| 取消监听方法。如果不传第二个参数,将取消该事件名称的全部监听方法。如果多次添加同一引用的函数,需要多次删除。 | ||
@@ -115,3 +115,3 @@ 返回当前实例。 | ||
| emitter.off('foo', fn); | ||
| emitter.off('foo', fn); // 取消 foo 的监听方法 fn | ||
| emitter.emit('foo'); | ||
@@ -121,4 +121,4 @@ // bar | ||
| emitter.off('foo'); // 取消 foo 全部监听方法 | ||
| emitter.emit('foo'); | ||
| emitter.off('foo'); // 取消 foo 的全部监听方法 | ||
| emitter.emit('foo'); // 什么都没发生 | ||
| ``` | ||
@@ -137,7 +137,7 @@ | ||
| emitter.on('foo', () => console.log('bar')); | ||
| emitter.once('foo', () => console.log('baz')); | ||
| emitter.once('foo', () => console.log(42)); | ||
| emitter.emit('foo'); | ||
| // bar | ||
| // baz | ||
| // 42 | ||
@@ -208,3 +208,3 @@ emitter.emit('foo'); | ||
| 返回事监听方法数组。 | ||
| 返回对应事件名称的监听方法数组。 | ||
@@ -247,3 +247,3 @@ ```typescript | ||
| 注册监听方法。同 `on` 方法,只是添加到前面(事件触发是按添加顺序执行)。 | ||
| 注册监听方法。同 `on` 方法,只是将监听方法添加到最前面(事件触发是按顺序执行)。 | ||
@@ -257,6 +257,6 @@ 返回当前实例。 | ||
| emitter.on('foo', () => console.log('bar')); | ||
| emitter.prependListener('foo', () => console.log('baz')); | ||
| emitter.prependListener('foo', () => console.log(42)); | ||
| emitter.emit('foo'); | ||
| // baz | ||
| // 42 | ||
| // bar | ||
@@ -267,3 +267,3 @@ ``` | ||
| 仅触发一次的监听方法。同 `once` 方法,只是添加到前面(事件触发是按添加顺序执行)。 | ||
| 仅触发一次的监听方法。同 `once` 方法,只是添加到最前面(事件触发是按顺序执行)。 | ||
@@ -277,6 +277,6 @@ 返回当前实例。 | ||
| emitter.on('foo', () => console.log('bar')); | ||
| emitter.prependOnceListener('foo', () => console.log('baz')); | ||
| emitter.prependOnceListener('foo', () => console.log(42)); | ||
| emitter.emit('foo'); | ||
| // baz | ||
| // 42 | ||
| // bar | ||
@@ -283,0 +283,0 @@ |
+230
-0
@@ -8,19 +8,249 @@ type Listener = (...args: any[]) => any; | ||
| }; | ||
| /** | ||
| * 事件触发器,支持浏览器端和 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'); | ||
| */ | ||
| declare class EmitterPro<F extends Listener = Listener> { | ||
| private handlers; | ||
| constructor(); | ||
| /** | ||
| * 获取全部事件名称。 | ||
| * | ||
| * @returns 事件名称数组。 | ||
| * @example | ||
| * emitter.on('foo', () => {}); | ||
| * emitter.on('bar', () => {}); | ||
| * | ||
| * emitter.eventNames(); // ['foo', 'bar'] | ||
| */ | ||
| eventNames(): (string | symbol)[]; | ||
| /** | ||
| * 获取事件名称的全部监听方法(原始方法,未经过包装处理)。 | ||
| * | ||
| * @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] | ||
| */ | ||
| rawListeners(eventName: EventName): F[]; | ||
| /** | ||
| * 获取事件名称的全部监听方法(如通过 `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] | ||
| */ | ||
| listeners(eventName: EventName): F[]; | ||
| /** | ||
| * 判断事件名称对应的监听方法是否存在。 | ||
| * | ||
| * @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 | ||
| */ | ||
| hasListener(eventName: EventName, listener: F): boolean; | ||
| private _on; | ||
| /** | ||
| * 注册监听方法。同 `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 | ||
| */ | ||
| prependListener(eventName: EventName, listener: F, context?: EventListener['context']): this; | ||
| /** | ||
| * 注册监听方法。允许多次添加同一引用的函数。 | ||
| * | ||
| * @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 | ||
| */ | ||
| on(eventName: EventName, listener: F, context?: EventListener['context']): this; | ||
| private _wrapOnce; | ||
| /** | ||
| * 仅触发一次的监听方法。使用方法同 `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 | ||
| */ | ||
| once(eventName: EventName, listener: F, context?: EventListener['context']): this; | ||
| /** | ||
| * 仅触发一次的监听方法。同 `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 | ||
| */ | ||
| prependOnceListener(eventName: EventName, listener: F, context?: EventListener['context']): this; | ||
| /** | ||
| * 取消监听方法。如果不传第二个参数,将取消该事件名称的全部监听方法。如果多次添加同一引用的函数,需要多次删除。 | ||
| * | ||
| * @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'); // 什么都没发生 | ||
| */ | ||
| off(eventName: EventName, listener?: F): this; | ||
| /** | ||
| * 取消全部事件名称的监听方法。 | ||
| * | ||
| * @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'); // 什么都没发生 | ||
| */ | ||
| offAll(): this; | ||
| /** | ||
| * 触发监听方法。 | ||
| * | ||
| * @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 | ||
| */ | ||
| emit(eventName: EventName, ...args: Parameters<F>): boolean; | ||
| } | ||
| export default EmitterPro; |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
79090
104.58%1253
276.28%1
Infinity%