Event.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import isNullOrUndefined from "./isNullOrUndefined";
  2. export default class Event {
  3. _eventMap = new Map<string, Array<(...arg: any) => void>>();
  4. on(event: string, callback: (...arg: any) => void) {
  5. if (event && typeof callback === 'function') {
  6. this._eventMap.has(event) || this._eventMap.set(event, []);
  7. this._eventMap.get(event).push(callback);
  8. }
  9. return this;
  10. }
  11. once(event: string, callback: (...arg: any) => void) {
  12. if (event && typeof callback === 'function') {
  13. const fn = (...args: any) => {
  14. callback(...args);
  15. this.off(event, fn);
  16. };
  17. this.on(event, fn);
  18. }
  19. }
  20. off(event: string, callback?: null | (() => void)) {
  21. if (event) {
  22. if (typeof callback === 'function') {
  23. const callbacks = this._eventMap.get(event);
  24. if (Array.isArray(callbacks) && callbacks.length) {
  25. let index = -1;
  26. while ((index = callbacks.findIndex(cb => cb === callback)) > -1) {
  27. callbacks.splice(index, 1);
  28. }
  29. }
  30. } else if (isNullOrUndefined(callback)) {
  31. this._eventMap.delete(event);
  32. }
  33. }
  34. return this;
  35. }
  36. emit(event: string, ...args: any[]) {
  37. if (!this._eventMap.has(event)) {
  38. return false;
  39. }
  40. this._eventMap.get(event).forEach(callback => callback(...args));
  41. return true;
  42. }
  43. }