# after-all

> Execute several async functions and get a callback when they are all done

Latest version **2.0.2** (published 2015-03-24) · MIT license · 0 weekly downloads

## Install

```sh
npm install after-all
pnpm add after-all
yarn add after-all
bun add after-all
```

## Health

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

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 2.0.2 |
| Published | 2015-03-24 |
| First published | 2014-01-29 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 1 |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 28 |
| Author | Eduardo Sorribas |
| Maintainers | sorribas |

## Links

- npm: https://www.npmjs.com/package/after-all
- Repository: https://github.com/sorribas/after-all
- Issues: https://github.com/sorribas/after-all/issues
- npm.io page: https://npm.io/package/after-all

## Dependencies (1)

- [once](https://npm.io/package/once.md) ^1.3.0

## Recent versions

- 2.0.2 (latest) — 2015-03-24
- 2.0.1 — 2014-08-29
- 2.0.0 — 2014-06-30
- 1.1.0 — 2014-06-23
- 1.0.0 — 2014-04-25
- 0.1.1 — 2014-03-17
- 0.1.0 — 2014-02-24
- 0.0.4 — 2014-02-24
- 0.0.3 — 2014-02-03
- 0.0.2 — 2014-01-29
- 0.0.1 — 2014-01-29

## README

# after-all

[![build status](https://secure.travis-ci.org/sorribas/after-all.png)](http://travis-ci.org/sorribas/after-all)

[![Sauce Test Status](https://saucelabs.com/browser-matrix/after-all.svg)](https://saucelabs.com/u/after-all)

Call several asynchronous functions and invoke a callback 'after all' of them are done.

## Installation

You can install it with npm.

```
npm install after-all
```

## Simple example

```js
var afterAll = require('after-all');

var next = afterAll(function(err) {
	if (err) return console.log(err); // one of the asynchronous calls had an error
	console.log('Yay! Everything is done');
});

// The above inner function will only be called when all of these asynchronous calls are done

someAsynchronousCall1({foo:'bar'}, next());
someAsynchronousCall2({val:2}, next(function(err, res) {
	// If you want to do something with the returned value, you can pass a function
	if (err) return;
	console.log('This was returned: '+res);
}));
```

## More complex example and sample use case

Imagine you have to create a dashboard page which has a list of customers
a list products, the total amount of sales and some more information.

Now, the queries to get this information are independent, yet we tend to wait for
one to be finished to start the next. We may be able to increase the performance
by starting some of this queries at the same time and waiting for the callbacks.

We can use after-all to do something like this.

```js

app.get('/dashboard.json', function(req, res) {
  var resp = {};
  var next = afterAll(function() {
    res.end(resp);
  });

  db.findCustomers(next(function(err, docs) {
    resp.customers = docs;
  }));

  var cb = next(); // wrapping the callback is optional
  db.findProducts(function(err, docs) {
    db.findProductsSales(function(sales) {
      resp.products = docs;
      resp.productsSales = sales;
      cb();
    });
  });

  db.findTodaySalesAmount(next(function(err, amount) {
    resp.todaySales = amount;
  }));

  db.findLastMonthSalesAmount(next(function(err, amount) {
    resp.lastMonthSales = amount;
  }));
});
```

As you can see, passing a callback to the `next` function is optional and it can be
useful to not pass any when you are doing more than one sequetial async operations as
in the example above.

Also notice that all the calls to `next` must be done on the same tick.

## Error handling

If an error is passed as the first parameter to the `next` callback, the 
final callback will be called immediately and the error will be passed to
it as the first argument.

## License

MIT

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