root / HServer / 00.Server / 00.Program / node_modules / once / README.md
이력 | 보기 | 이력해설 | 다운로드 (1.73 KB)
| 1 | 39 | HKM | # 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 | ``` |