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