您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

EventEmitterForwarder.ts 1.9KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /**
  2. * Implements utility to forward events from one eventEmitter to another.
  3. * @param src {object} instance of EventEmitter or another class that implements
  4. * addListener method which will register listener to EventEmitter instance.
  5. * @param dest {object} instance of EventEmitter or another class that
  6. * implements emit method which will emit an event.
  7. */
  8. export default class EventEmitterForwarder {
  9. src: any;
  10. dest: any;
  11. listeners: Map<any, any>;
  12. /**
  13. * @constructor
  14. */
  15. constructor(src: any, dest: any) {
  16. if (!src || !dest || typeof src.addListener !== 'function' || typeof dest.emit !== 'function') {
  17. throw new Error('Invalid arguments passed to EventEmitterForwarder');
  18. }
  19. this.src = src;
  20. this.dest = dest;
  21. this.listeners = new Map();
  22. }
  23. /**
  24. * Adds event to be forwarded from src to dest.
  25. * @param srcEvent {string} the event that EventEmitterForwarder is listening
  26. * for.
  27. * @param dstEvent {string} the event that will be fired from dest.
  28. * @param arguments all other passed arguments are going to be fired with
  29. * dstEvent.
  30. */
  31. forward(...args) {
  32. const srcEvent = args[0];
  33. // This will be the "this" value for emit function.
  34. args[0] = this.dest;
  35. // Using bind.apply to pass the arguments as Array-like object ("arguments")
  36. const newListener = Function.prototype.bind.apply(this.dest.emit, args);
  37. this.src.addListener(srcEvent, newListener);
  38. this.listeners.set(srcEvent, newListener);
  39. }
  40. /**
  41. * Clears the listeners for the supplied events.
  42. *
  43. * @param args all the events which listeners to be cleaned.
  44. */
  45. removeListeners(...args) {
  46. args.forEach(a => {
  47. const l = this.listeners.get(a);
  48. if (l) {
  49. this.src.removeListener(a, l);
  50. this.listeners.delete(a);
  51. }
  52. });
  53. }
  54. }