1# once 2 3Only call a function once. 4 5## usage 6 7```javascript 8var once = require('once') 9 10function load (file, cb) { 11 cb = once(cb) 12 loader.load('file') 13 loader.once('load', cb) 14 loader.once('error', cb) 15} 16``` 17 18Or add to the Function.prototype in a responsible way: 19 20```javascript 21// only has to be done once 22require('once').proto() 23 24function load (file, cb) { 25 cb = cb.once() 26 loader.load('file') 27 loader.once('load', cb) 28 loader.once('error', cb) 29} 30``` 31 32Ironically, the prototype feature makes this module twice as 33complicated as necessary. 34 35To check whether you function has been called, use `fn.called`. Once the 36function is called for the first time the return value of the original 37function is saved in `fn.value` and subsequent calls will continue to 38return this value. 39 40```javascript 41var once = require('once') 42 43function load (cb) { 44 cb = once(cb) 45 var stream = createStream() 46 stream.once('data', cb) 47 stream.once('end', function () { 48 if (!cb.called) cb(new Error('not found')) 49 }) 50} 51``` 52 53## `once.strict(func)` 54 55Throw an error if the function is called twice. 56 57Some functions are expected to be called only once. Using `once` for them would 58potentially hide logical errors. 59 60In the example below, the `greet` function has to call the callback only once: 61 62```javascript 63function greet (name, cb) { 64 // return is missing from the if statement 65 // when no name is passed, the callback is called twice 66 if (!name) cb('Hello anonymous') 67 cb('Hello ' + name) 68} 69 70function log (msg) { 71 console.log(msg) 72} 73 74// this will print 'Hello anonymous' but the logical error will be missed 75greet(null, once(msg)) 76 77// once.strict will print 'Hello anonymous' and throw an error when the callback will be called the second time 78greet(null, once.strict(msg)) 79``` 80