Spaces:
Configuration error
Configuration error
| # 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)) | |
| ``` | |