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.
		
		
		
		
			
				
					106 lines
				
				4.1 KiB
			
		
		
			
		
	
	
					106 lines
				
				4.1 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								# EventEmitter3
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[](https://www.npmjs.com/package/eventemitter3)[](https://travis-ci.org/primus/eventemitter3)[](https://david-dm.org/primus/eventemitter3)[](https://coveralls.io/r/primus/eventemitter3?branch=master)[](https://webchat.freenode.net/?channels=primus)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[](https://saucelabs.com/u/eventemitter3)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								EventEmitter3 is a high performance EventEmitter. It has been micro-optimized
							 | 
						||
| 
								 | 
							
								for various of code paths making this, one of, if not the fastest EventEmitter
							 | 
						||
| 
								 | 
							
								available for Node.js and browsers. The module is API compatible with the
							 | 
						||
| 
								 | 
							
								EventEmitter that ships by default with Node.js but there are some slight
							 | 
						||
| 
								 | 
							
								differences:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- Domain support has been removed.
							 | 
						||
| 
								 | 
							
								- We do not `throw` an error when you emit an `error` event and nobody is
							 | 
						||
| 
								 | 
							
								  listening.
							 | 
						||
| 
								 | 
							
								- The `newListener` event is removed as the use-cases for this functionality are
							 | 
						||
| 
								 | 
							
								  really just edge cases.
							 | 
						||
| 
								 | 
							
								- No `setMaxListeners` and its pointless memory leak warnings. If you want to
							 | 
						||
| 
								 | 
							
								  add `end` listeners you should be able to do that without modules complaining.
							 | 
						||
| 
								 | 
							
								- No `listenerCount` method. Use `EE.listeners(event).length` instead.
							 | 
						||
| 
								 | 
							
								- Support for custom context for events so there is no need to use `fn.bind`.
							 | 
						||
| 
								 | 
							
								- The `listeners` method can do existence checking instead of returning only
							 | 
						||
| 
								 | 
							
								  arrays.
							 | 
						||
| 
								 | 
							
								- The `removeListener` method removes all matching listeners, not only the
							 | 
						||
| 
								 | 
							
								  first.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								It's a drop in replacement for existing EventEmitters, but just faster. Free
							 | 
						||
| 
								 | 
							
								performance, who wouldn't want that? The EventEmitter is written in EcmaScript 3
							 | 
						||
| 
								 | 
							
								so it will work in the oldest browsers and node versions that you need to
							 | 
						||
| 
								 | 
							
								support.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Installation
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```bash
							 | 
						||
| 
								 | 
							
								$ npm install --save eventemitter3        # npm
							 | 
						||
| 
								 | 
							
								$ component install primus/eventemitter3  # Component
							 | 
						||
| 
								 | 
							
								$ bower install eventemitter3             # Bower
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Usage
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								After installation the only thing you need to do is require the module:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var EventEmitter = require('eventemitter3');
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								And you're ready to create your own EventEmitter instances. For the API
							 | 
						||
| 
								 | 
							
								documentation, please follow the official Node.js documentation:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								http://nodejs.org/api/events.html
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Contextual emits
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								We've upgraded the API of the `EventEmitter.on`, `EventEmitter.once` and
							 | 
						||
| 
								 | 
							
								`EventEmitter.removeListener` to accept an extra argument which is the `context`
							 | 
						||
| 
								 | 
							
								or `this` value that should be set for the emitted events. This means you no
							 | 
						||
| 
								 | 
							
								longer have the overhead of an event that required `fn.bind` in order to get a
							 | 
						||
| 
								 | 
							
								custom `this` value.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var EE = new EventEmitter()
							 | 
						||
| 
								 | 
							
								  , context = { foo: 'bar' };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function emitted() {
							 | 
						||
| 
								 | 
							
								  console.log(this === context); // true
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								EE.once('event-name', emitted, context);
							 | 
						||
| 
								 | 
							
								EE.on('another-event', emitted, context);
							 | 
						||
| 
								 | 
							
								EE.removeListener('another-event', emitted, context);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Existence
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								To check if there is already a listener for a given event you can supply the
							 | 
						||
| 
								 | 
							
								`listeners` method with an extra boolean argument. This will transform the
							 | 
						||
| 
								 | 
							
								output from an array, to a boolean value which indicates if there are listeners
							 | 
						||
| 
								 | 
							
								in place for the given event:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var EE = new EventEmitter();
							 | 
						||
| 
								 | 
							
								EE.once('event-name', function () {});
							 | 
						||
| 
								 | 
							
								EE.on('another-event', function () {});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								EE.listeners('event-name', true); // returns true
							 | 
						||
| 
								 | 
							
								EE.listeners('unknown-name', true); // returns false
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Tests and benchmarks
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This module is well tested. You can run:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- `npm test` to run the tests under Node.js.
							 | 
						||
| 
								 | 
							
								- `npm run test-browser` to run the tests in real browsers via Sauce Labs.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								We also have a set of benchmarks to compare EventEmitter3 with some available
							 | 
						||
| 
								 | 
							
								alternatives. To run the benchmarks run `npm run benchmark`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Tests and benchmarks are not included in the npm package. If you want to play
							 | 
						||
| 
								 | 
							
								with them you have to clone the GitHub repository.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## License
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[MIT](LICENSE)
							 |