# once

> Run a function exactly one time

Latest version **1.4.0** (published 2016-09-06) · ISC license · 0 weekly downloads

## Install

```sh
npm install once
pnpm add once
yarn add once
bun add once
```

## Health

**Score 23/100 (F)** — status: abandoned.

Positive: has types package; no vulnerabilities; high quality score.

Warnings: low downloads; no esm support.

Negative: abandoned; declining downloads.

## Facts

| | |
|---|---|
| Version | 1.4.0 |
| Published | 2016-09-06 |
| First published | 2012-08-14 |
| Weekly downloads | 0 |
| License | ISC |
| TypeScript types | separate (@types/once) |
| Module format | CommonJS |
| Dependencies | 1 |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 222 |
| Author | Isaac Z. Schlueter |
| Maintainers | isaacs |
| Keywords | once, function, one, single |

## Links

- npm: https://www.npmjs.com/package/once
- Repository: https://github.com/isaacs/once
- Homepage: https://github.com/isaacs/once#readme
- Issues: https://github.com/isaacs/once/issues
- npm.io page: https://npm.io/package/once

## Dependencies (1)

- [wrappy](https://npm.io/package/wrappy.md) 1

## Recent versions

- 1.4.0 (latest) — 2016-09-06
- 1.3.3 — 2015-11-20
- 1.3.2 — 2015-05-04
- 1.3.1 — 2014-09-18
- 1.3.0 — 2013-10-24
- 1.2.0 — 2013-08-12
- 1.1.1 — 2012-08-14

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

---
_Source: https://npm.io/package/once · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
