代码实现

pubsub.js
仿照eventBus

  1. let pubSub = {
  2. handlers: {},
  3. once: function ( eventType, handler ) {
  4. this.handlers[eventType] = [handler];
  5. return this;
  6. },
  7. on: function ( eventType, handler ) {
  8. if ( !( eventType in this.handlers ) ) {
  9. this.handlers[eventType] = [];
  10. }
  11. this.handlers[eventType].push( handler );
  12. return this;
  13. },
  14. keepEmit: function ( eventType ) {
  15. var handlerArgs = Array.prototype.slice.call( arguments, 1 );
  16. if ( !this.handlers[eventType] ) {
  17. let self = this;
  18. setTimeout( () => {
  19. self.keepEmit( eventType, ...handlerArgs );
  20. }, 200 );
  21. } else {
  22. for ( var i = 0; i < this.handlers[eventType].length; i++ ) {
  23. this.handlers[eventType][i].call( this, ...handlerArgs );
  24. }
  25. }
  26. return this;
  27. },
  28. emit: function ( eventType ) {
  29. var handlerArgs = Array.prototype.slice.call( arguments, 1 );
  30. var handlers = this.handlers[eventType] || [];
  31. for ( var i = 0; i < handlers.length; i++ ) {
  32. this.handlers[eventType][i].apply( this, handlerArgs );
  33. }
  34. return this;
  35. },
  36. remove: function ( eventType ) {
  37. this.handlers[eventType] = [];
  38. return this;
  39. }
  40. };
  41. if ( window ) {
  42. window.pubSub = pubSub;
  43. }
  44. export default pubSub;

使用示例

  1. import pubSub from '@/lib/pubSub';
  2. pubSub.on('eventName', (data)=>{
  3. console.log(data)
  4. });
  5. ...
  6. pubSub.emit('eventName', data);