100 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| class EventPubSub {
 | |
|     constructor( scope ) {
 | |
|         this._events_ = {};
 | |
|         this.publish = this.trigger = this.emit;
 | |
|         this.subscribe = this.on;
 | |
|         this.unSubscribe = this.off;
 | |
|     }
 | |
| 
 | |
|     on( type, handler, once ) {
 | |
|         if ( !handler ) {
 | |
|             throw new ReferenceError( 'handler not defined.' );
 | |
|         }
 | |
| 
 | |
|         if ( !this._events_[ type ] ) {
 | |
|             this._events_[ type ] = [];
 | |
|         }
 | |
| 
 | |
|          if(once){
 | |
|             handler._once_ = once;
 | |
|         }
 | |
| 
 | |
|         this._events_[ type ].push( handler );
 | |
|         return this;
 | |
|     }
 | |
| 
 | |
|     once( type, handler ) {
 | |
|         return this.on( type, handler, true );
 | |
|     }
 | |
| 
 | |
|     off( type, handler ) {
 | |
|         if ( !this._events_[ type ] ) {
 | |
|             return this;
 | |
|         }
 | |
| 
 | |
|         if ( !handler ) {
 | |
|             throw new ReferenceError( 'handler not defined. if you wish to remove all handlers from the event please pass "*" as the handler' );
 | |
|         }
 | |
| 
 | |
|         if ( handler == '*' ) {
 | |
|             delete this._events_[ type ];
 | |
|             return this;
 | |
|         }
 | |
| 
 | |
|         const handlers = this._events_[ type ];
 | |
| 
 | |
|         while ( handlers.includes( handler ) ) {
 | |
|             handlers.splice(
 | |
|                 handlers.indexOf( handler ),
 | |
|                 1
 | |
|             );
 | |
|         }
 | |
| 
 | |
|         if ( handlers.length < 1 ) {
 | |
|             delete this._events_[ type ];
 | |
|         }
 | |
| 
 | |
|         return this;
 | |
|     }
 | |
| 
 | |
|     emit( type, ...args ) {
 | |
|         if ( !this._events_[ type ] ) {
 | |
|             return this.emit$( type, ...args );
 | |
|         }
 | |
| 
 | |
|         const handlers = this._events_[ type ];
 | |
|         const onceHandled=[];
 | |
| 
 | |
|         for ( let handler of handlers ) {
 | |
|             handler.apply( this, args );
 | |
|             if(handler._once_){
 | |
|               onceHandled.push(handler);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         for(let handler of onceHandled){
 | |
|           this.off(type,handler);
 | |
|         }
 | |
| 
 | |
|         return this.emit$( type, ...args );
 | |
|     }
 | |
| 
 | |
|     emit$( type, ...args ) {
 | |
|         if ( !this._events_[ '*' ] ) {
 | |
|             return this;
 | |
|         }
 | |
| 
 | |
|         const catchAll = this._events_[ '*' ];
 | |
| 
 | |
|         for ( let handler of catchAll ) {
 | |
|             handler.call( this, type, ...args );
 | |
|         }
 | |
| 
 | |
|         return this;
 | |
|     }
 | |
| }
 | |
| 
 | |
| module.exports = EventPubSub;
 |