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)) | ||
|  | ``` |