| [9af201e] | 1 | # once
|
|---|
| 2 |
|
|---|
| 3 | Only call a function once.
|
|---|
| 4 |
|
|---|
| 5 | ## usage
|
|---|
| 6 |
|
|---|
| 7 | ```javascript
|
|---|
| 8 | var once = require('once')
|
|---|
| 9 |
|
|---|
| 10 | function load (file, cb) {
|
|---|
| 11 | cb = once(cb)
|
|---|
| 12 | loader.load('file')
|
|---|
| 13 | loader.once('load', cb)
|
|---|
| 14 | loader.once('error', cb)
|
|---|
| 15 | }
|
|---|
| 16 | ```
|
|---|
| 17 |
|
|---|
| 18 | Or add to the Function.prototype in a responsible way:
|
|---|
| 19 |
|
|---|
| 20 | ```javascript
|
|---|
| 21 | // only has to be done once
|
|---|
| 22 | require('once').proto()
|
|---|
| 23 |
|
|---|
| 24 | function load (file, cb) {
|
|---|
| 25 | cb = cb.once()
|
|---|
| 26 | loader.load('file')
|
|---|
| 27 | loader.once('load', cb)
|
|---|
| 28 | loader.once('error', cb)
|
|---|
| 29 | }
|
|---|
| 30 | ```
|
|---|
| 31 |
|
|---|
| 32 | Ironically, the prototype feature makes this module twice as
|
|---|
| 33 | complicated as necessary.
|
|---|
| 34 |
|
|---|
| 35 | To check whether you function has been called, use `fn.called`. Once the
|
|---|
| 36 | function is called for the first time the return value of the original
|
|---|
| 37 | function is saved in `fn.value` and subsequent calls will continue to
|
|---|
| 38 | return this value.
|
|---|
| 39 |
|
|---|
| 40 | ```javascript
|
|---|
| 41 | var once = require('once')
|
|---|
| 42 |
|
|---|
| 43 | function 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 |
|
|---|
| 55 | Throw an error if the function is called twice.
|
|---|
| 56 |
|
|---|
| 57 | Some functions are expected to be called only once. Using `once` for them would
|
|---|
| 58 | potentially hide logical errors.
|
|---|
| 59 |
|
|---|
| 60 | In the example below, the `greet` function has to call the callback only once:
|
|---|
| 61 |
|
|---|
| 62 | ```javascript
|
|---|
| 63 | function 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 |
|
|---|
| 70 | function log (msg) {
|
|---|
| 71 | console.log(msg)
|
|---|
| 72 | }
|
|---|
| 73 |
|
|---|
| 74 | // this will print 'Hello anonymous' but the logical error will be missed
|
|---|
| 75 | greet(null, once(msg))
|
|---|
| 76 |
|
|---|
| 77 | // once.strict will print 'Hello anonymous' and throw an error when the callback will be called the second time
|
|---|
| 78 | greet(null, once.strict(msg))
|
|---|
| 79 | ```
|
|---|