You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

72 lines
1.3 KiB

  1. module.exports = {
  2. events: {},
  3. queue: [],
  4. on: function (event, callback) {
  5. let list = this.events[event] || (this.events[event] = []);
  6. list.push(callback);
  7. for (let i = 0; i < this.queue.length; i++) {
  8. let q = this.queue[i];
  9. if (q.event !== event)
  10. continue;
  11. this.queue.splice(i, 1);
  12. i--;
  13. q.args.splice(0, 0, event);
  14. this.emit.apply(this, q.args);
  15. }
  16. return callback;
  17. },
  18. off: function (event, callback) {
  19. let list = this.events[event] || [];
  20. let lLen = list.length;
  21. for (let i = 0; i < lLen; i++) {
  22. if (list[i] === callback) {
  23. list.splice(i, 1);
  24. i--;
  25. lLen--;
  26. }
  27. }
  28. if (lLen === 0)
  29. delete this.events[event];
  30. },
  31. emit: function (event) {
  32. let args = [].slice.call(arguments, 1);
  33. let list = this.events[event];
  34. if (!list) {
  35. this.queue.push({
  36. event: event,
  37. args: args
  38. });
  39. return;
  40. }
  41. let len = list.length;
  42. for (let i = 0; i < len; i++) {
  43. let l = list[i];
  44. l.apply(null, args);
  45. }
  46. },
  47. //In the future, all events should be non sticky
  48. emitNoSticky: function (event) {
  49. let args = [].slice.call(arguments, 1);
  50. let list = this.events[event];
  51. if (!list)
  52. return;
  53. let len = list.length;
  54. for (let i = 0; i < len; i++) {
  55. let l = list[i];
  56. l.apply(null, args);
  57. }
  58. }
  59. };