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