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.
		
		
		
		
		
			
		
			
				
					80 lines
				
				1.7 KiB
			
		
		
			
		
	
	
					80 lines
				
				1.7 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								# once
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Only call a function once.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## usage
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```javascript
							 | 
						||
| 
								 | 
							
								var once = require('once')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function load (file, cb) {
							 | 
						||
| 
								 | 
							
								  cb = once(cb)
							 | 
						||
| 
								 | 
							
								  loader.load('file')
							 | 
						||
| 
								 | 
							
								  loader.once('load', cb)
							 | 
						||
| 
								 | 
							
								  loader.once('error', cb)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Or add to the Function.prototype in a responsible way:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```javascript
							 | 
						||
| 
								 | 
							
								// only has to be done once
							 | 
						||
| 
								 | 
							
								require('once').proto()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function load (file, cb) {
							 | 
						||
| 
								 | 
							
								  cb = cb.once()
							 | 
						||
| 
								 | 
							
								  loader.load('file')
							 | 
						||
| 
								 | 
							
								  loader.once('load', cb)
							 | 
						||
| 
								 | 
							
								  loader.once('error', cb)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Ironically, the prototype feature makes this module twice as
							 | 
						||
| 
								 | 
							
								complicated as necessary.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								To check whether you function has been called, use `fn.called`. Once the
							 | 
						||
| 
								 | 
							
								function is called for the first time the return value of the original
							 | 
						||
| 
								 | 
							
								function is saved in `fn.value` and subsequent calls will continue to
							 | 
						||
| 
								 | 
							
								return this value.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```javascript
							 | 
						||
| 
								 | 
							
								var once = require('once')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function load (cb) {
							 | 
						||
| 
								 | 
							
								  cb = once(cb)
							 | 
						||
| 
								 | 
							
								  var stream = createStream()
							 | 
						||
| 
								 | 
							
								  stream.once('data', cb)
							 | 
						||
| 
								 | 
							
								  stream.once('end', function () {
							 | 
						||
| 
								 | 
							
								    if (!cb.called) cb(new Error('not found'))
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## `once.strict(func)`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Throw an error if the function is called twice.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Some functions are expected to be called only once. Using `once` for them would
							 | 
						||
| 
								 | 
							
								potentially hide logical errors.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								In the example below, the `greet` function has to call the callback only once:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```javascript
							 | 
						||
| 
								 | 
							
								function greet (name, cb) {
							 | 
						||
| 
								 | 
							
								  // return is missing from the if statement
							 | 
						||
| 
								 | 
							
								  // when no name is passed, the callback is called twice
							 | 
						||
| 
								 | 
							
								  if (!name) cb('Hello anonymous')
							 | 
						||
| 
								 | 
							
								  cb('Hello ' + name)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function log (msg) {
							 | 
						||
| 
								 | 
							
								  console.log(msg)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// this will print 'Hello anonymous' but the logical error will be missed
							 | 
						||
| 
								 | 
							
								greet(null, once(msg))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// once.strict will print 'Hello anonymous' and throw an error when the callback will be called the second time
							 | 
						||
| 
								 | 
							
								greet(null, once.strict(msg))
							 | 
						||
| 
								 | 
							
								```
							 |