Guest User

Untitled

a guest
Feb 18th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.44 KB | None | 0 0
  1. var emitter = {
  2. // Свойство в котором хранятся все события.
  3. subscriptions: {},
  4.  
  5. // Подписывает на событие. На любое событие подписчик может
  6. // подписаться неограниченное количество раз.
  7. on: function (event, subscriber, handler) {
  8. if (!this.subscriptions.hasOwnProperty(event)) {
  9. this.subscriptions[event] = [];
  10. }
  11.  
  12. this.subscriptions[event].push({
  13. subscriber: subscriber,
  14. handler: handler
  15. });
  16.  
  17. return this;
  18. },
  19.  
  20. // Отписывает от события подписчика. После отписки, при возникновении
  21. // данного события, никаких обработчиков, связанных с этим подписчиком,
  22. // не должно быть вызвано. Есть возможность повторно подписаться и снова
  23. //получать события.
  24. off: function (event, subscriber) {
  25. if (this.subscriptions.hasOwnProperty(event)) {
  26. delete this.subscriptions[event]
  27. }
  28.  
  29. return this;
  30. },
  31.  
  32. //Оповещение всех подписчиков (не отписавшихся). Вызывает все функции-
  33. //обработчики в порядке подписки.
  34. emit: function (event) {
  35. for (let i = 0; i < this.subscriptions[event].length; i++) {
  36. this.subscriptions[event][i].handler();
  37. }
  38.  
  39. return this;
  40. }
  41. };
  42.  
  43. // Определим объект для счетчика нотификаций
  44. var notifications = {
  45. counter: 0,
  46. count: function () {
  47. this.counter++;
  48. }
  49. };
  50.  
  51. // Определим объект для хранения логов
  52. var logger = {
  53. logs: []
  54. };
  55.  
  56. emitter
  57. .on('new_notification', notifications, notifications.count)
  58. .on('new_notification', logger, function () {
  59. this.logs.push('Произошло новое событие new_notification');
  60. })
  61. .on('new_notification', logger, function () {
  62. // this указывает на logger
  63. this.logs.push('Добавлено. Количество - ' + notifications.counter);
  64. })
  65. .emit('new_notification');
  66.  
  67. this.subscriptions[event].push({
  68. subscriber: subscriber,
  69. handler: handler.bind(subscriber)
  70. });
Add Comment
Please, Sign In to add comment