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.
 
 
 

67 rivejä
1.3 KiB

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