schangxiang@126.com
2025-09-19 0821aa23eabe557c0d9ef5dbe6989c68be35d1fe
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# 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))
```