https://github.com/isaacs/once
Run a function exactly one time
https://github.com/isaacs/once
Last synced: 11 months ago
JSON representation
Run a function exactly one time
- Host: GitHub
- URL: https://github.com/isaacs/once
- Owner: isaacs
- License: isc
- Created: 2012-08-14T07:25:37.000Z (over 13 years ago)
- Default Branch: main
- Last Pushed: 2023-10-10T17:28:46.000Z (over 2 years ago)
- Last Synced: 2025-04-30T19:03:26.400Z (12 months ago)
- Language: JavaScript
- Size: 75.2 KB
- Stars: 222
- Watchers: 7
- Forks: 29
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-micro-npm-packages-zh - once - 一次运行一个函数. (模块 / 函数)
- awesome-micro-npm-packages - once - Run a function exactly one time. (Modules / Function)
- fucking-awesome-micro-npm-packages - once - Run a function exactly one time. (Modules / Function)
- awesome-micro-npm-packages - once - Run a function exactly one time. (Modules / Function)
README
# 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 your 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))
```