Blame view

node_modules/once/README.md 1.73 KB
aaac7fed   liuqimichale   add
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))
  ```