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