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