dgate 2.1.0

DGate API Gateway - High-performance API gateway with JavaScript module support
Documentation
<h1 align="center">Neo-Async</h1>

<p align="center">
  <img src="https://raw.githubusercontent.com/wiki/suguru03/neo-async/images/neo_async_v2.png" width="250px" />
</p>

<p align="center">
  <a href="https://www.npmjs.com/package/neo-async"><img alt="npm" src="https://img.shields.io/npm/v/neo-async.svg"></a>
  <a href="https://travis-ci.org/suguru03/neo-async"><img alt="Travis Status" src="https://img.shields.io/travis/suguru03/neo-async.svg"></a>
  <a href="https://codecov.io/gh/suguru03/neo-async"><img alt="Coverage Status" src="https://img.shields.io/codecov/c/github/suguru03/neo-async/master.svg"></a>
  <a href="https://www.npmjs.com/package/neo-async"><img alt="download" src="https://img.shields.io/npm/dm/neo-async.svg"></a>
  <a href="https://lgtm.com/projects/g/suguru03/neo-async/context:javascript"><img src="https://img.shields.io/lgtm/grade/javascript/g/suguru03/neo-async.svg?logo=lgtm&logoWidth=18" alt="Code Quality: Javascript" height="18"></a>
  <a href="https://lgtm.com/projects/g/suguru03/neo-async/alerts"><img src="https://img.shields.io/lgtm/alerts/g/suguru03/neo-async.svg?logo=lgtm&logoWidth=18" alt="Total Alerts" height="18"></a>
  <a href="https://app.fossa.io/projects/git%2Bgithub.com%2Fsuguru03%2Fneo-async?ref=badge_shield"><img src="https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuguru03%2Fneo-async.svg?type=shield" alt="FOSSA" height="18"></a>
</p>

Neo-Async is thought to be used as a drop-in replacement for [Async](https://github.com/caolan/async), it almost fully covers its functionality and runs [faster](#benchmark).

Benchmark is [here](#benchmark)!

Bluebird's benchmark is [here](https://github.com/suguru03/bluebird/tree/aigle/benchmark)!

## Code Coverage
![coverage](https://raw.githubusercontent.com/wiki/suguru03/neo-async/images/coverage.png)

## Installation

### In a browser
```html
<script src="async.min.js"></script>
```

### In an AMD loader
```js
require(['async'], function(async) {});
```

### Promise and async/await

I recommend to use [`Aigle`](https://github.com/suguru03/aigle).

It is optimized for Promise handling and has almost the same functionality as `neo-async`.

### Node.js

#### standard

```bash
$ npm install neo-async
```
```js
var async = require('neo-async');
```

#### replacement
```bash
$ npm install neo-async
$ ln -s ./node_modules/neo-async ./node_modules/async
```
```js
var async = require('async');
```

### Bower

```bash
bower install neo-async
```

## Feature

[JSDoc](http://suguru03.github.io/neo-async/doc/async.html)

\* not in Async

### Collections

- [`each`]http://suguru03.github.io/neo-async/doc/async.each.html
- [`eachSeries`]http://suguru03.github.io/neo-async/doc/async.eachSeries.html
- [`eachLimit`]http://suguru03.github.io/neo-async/doc/async.eachLimit.html
- [`forEach`]http://suguru03.github.io/neo-async/doc/async.each.html -> [`each`]http://suguru03.github.io/neo-async/doc/async.each.html
- [`forEachSeries`]http://suguru03.github.io/neo-async/doc/async.eachSeries.html -> [`eachSeries`]http://suguru03.github.io/neo-async/doc/async.eachSeries.html
- [`forEachLimit`]http://suguru03.github.io/neo-async/doc/async.eachLimit.html -> [`eachLimit`]http://suguru03.github.io/neo-async/doc/async.eachLimit.html
- [`eachOf`]http://suguru03.github.io/neo-async/doc/async.each.html -> [`each`]http://suguru03.github.io/neo-async/doc/async.each.html
- [`eachOfSeries`]http://suguru03.github.io/neo-async/doc/async.eachSeries.html -> [`eachSeries`]http://suguru03.github.io/neo-async/doc/async.eachSeries.html
- [`eachOfLimit`]http://suguru03.github.io/neo-async/doc/async.eachLimit.html -> [`eachLimit`]http://suguru03.github.io/neo-async/doc/async.eachLimit.html
- [`forEachOf`]http://suguru03.github.io/neo-async/doc/async.each.html -> [`each`]http://suguru03.github.io/neo-async/doc/async.each.html
- [`forEachOfSeries`]http://suguru03.github.io/neo-async/doc/async.eachSeries.html -> [`eachSeries`]http://suguru03.github.io/neo-async/doc/async.eachSeries.html
- [`eachOfLimit`]http://suguru03.github.io/neo-async/doc/async.eachLimit.html -> [`forEachLimit`]http://suguru03.github.io/neo-async/doc/async.eachLimit.html
- [`map`]http://suguru03.github.io/neo-async/doc/async.map.html
- [`mapSeries`]http://suguru03.github.io/neo-async/doc/async.mapSeries.html
- [`mapLimit`]http://suguru03.github.io/neo-async/doc/async.mapLimit.html
- [`mapValues`]http://suguru03.github.io/neo-async/doc/async.mapValues.html
- [`mapValuesSeries`]http://suguru03.github.io/neo-async/doc/async.mapValuesSeries.html
- [`mapValuesLimit`]http://suguru03.github.io/neo-async/doc/async.mapValuesLimit.html
- [`filter`]http://suguru03.github.io/neo-async/doc/async.filter.html
- [`filterSeries`]http://suguru03.github.io/neo-async/doc/async.filterSeries.html
- [`filterLimit`]http://suguru03.github.io/neo-async/doc/async.filterLimit.html
- [`select`]http://suguru03.github.io/neo-async/doc/async.filter.html -> [`filter`]http://suguru03.github.io/neo-async/doc/async.filter.html
- [`selectSeries`]http://suguru03.github.io/neo-async/doc/async.filterSeries.html -> [`filterSeries`]http://suguru03.github.io/neo-async/doc/async.filterSeries.html
- [`selectLimit`]http://suguru03.github.io/neo-async/doc/async.filterLimit.html -> [`filterLimit`]http://suguru03.github.io/neo-async/doc/async.filterLimit.html
- [`reject`]http://suguru03.github.io/neo-async/doc/async.reject.html
- [`rejectSeries`]http://suguru03.github.io/neo-async/doc/async.rejectSeries.html
- [`rejectLimit`]http://suguru03.github.io/neo-async/doc/async.rejectLimit.html
- [`detect`]http://suguru03.github.io/neo-async/doc/async.detect.html
- [`detectSeries`]http://suguru03.github.io/neo-async/doc/async.detectSeries.html
- [`detectLimit`]http://suguru03.github.io/neo-async/doc/async.detectLimit.html
- [`find`]http://suguru03.github.io/neo-async/doc/async.detect.html -> [`detect`]http://suguru03.github.io/neo-async/doc/async.detect.html
- [`findSeries`]http://suguru03.github.io/neo-async/doc/async.detectSeries.html -> [`detectSeries`]http://suguru03.github.io/neo-async/doc/async.detectSeries.html
- [`findLimit`]http://suguru03.github.io/neo-async/doc/async.detectLimit.html -> [`detectLimit`]http://suguru03.github.io/neo-async/doc/async.detectLimit.html
- [`pick`]http://suguru03.github.io/neo-async/doc/async.pick.html *
- [`pickSeries`]http://suguru03.github.io/neo-async/doc/async.pickSeries.html *
- [`pickLimit`]http://suguru03.github.io/neo-async/doc/async.pickLimit.html *
- [`omit`]http://suguru03.github.io/neo-async/doc/async.omit.html *
- [`omitSeries`]http://suguru03.github.io/neo-async/doc/async.omitSeries.html *
- [`omitLimit`]http://suguru03.github.io/neo-async/doc/async.omitLimit.html *
- [`reduce`]http://suguru03.github.io/neo-async/doc/async.reduce.html
- [`inject`]http://suguru03.github.io/neo-async/doc/async.reduce.html -> [`reduce`]http://suguru03.github.io/neo-async/doc/async.reduce.html
- [`foldl`]http://suguru03.github.io/neo-async/doc/async.reduce.html -> [`reduce`]http://suguru03.github.io/neo-async/doc/async.reduce.html
- [`reduceRight`]http://suguru03.github.io/neo-async/doc/async.reduceRight.html
- [`foldr`]http://suguru03.github.io/neo-async/doc/async.reduceRight.html -> [`reduceRight`]http://suguru03.github.io/neo-async/doc/async.reduceRight.html
- [`transform`]http://suguru03.github.io/neo-async/doc/async.transform.html
- [`transformSeries`]http://suguru03.github.io/neo-async/doc/async.transformSeries.html *
- [`transformLimit`]http://suguru03.github.io/neo-async/doc/async.transformLimit.html *
- [`sortBy`]http://suguru03.github.io/neo-async/doc/async.sortBy.html
- [`sortBySeries`]http://suguru03.github.io/neo-async/doc/async.sortBySeries.html *
- [`sortByLimit`]http://suguru03.github.io/neo-async/doc/async.sortByLimit.html *
- [`some`]http://suguru03.github.io/neo-async/doc/async.some.html
- [`someSeries`]http://suguru03.github.io/neo-async/doc/async.someSeries.html
- [`someLimit`]http://suguru03.github.io/neo-async/doc/async.someLimit.html
- [`any`]http://suguru03.github.io/neo-async/doc/async.some.html -> [`some`]http://suguru03.github.io/neo-async/doc/async.some.html
- [`anySeries`]http://suguru03.github.io/neo-async/doc/async.someSeries.html -> [`someSeries`]http://suguru03.github.io/neo-async/doc/async.someSeries.html
- [`anyLimit`]http://suguru03.github.io/neo-async/doc/async.someLimit.html -> [`someLimit`]http://suguru03.github.io/neo-async/doc/async.someLimit.html
- [`every`]http://suguru03.github.io/neo-async/doc/async.every.html
- [`everySeries`]http://suguru03.github.io/neo-async/doc/async.everySeries.html
- [`everyLimit`]http://suguru03.github.io/neo-async/doc/async.everyLimit.html
- [`all`]http://suguru03.github.io/neo-async/doc/async.every.html -> [`every`]http://suguru03.github.io/neo-async/doc/async.every.html
- [`allSeries`]http://suguru03.github.io/neo-async/doc/async.everySeries.html -> [`every`]http://suguru03.github.io/neo-async/doc/async.everySeries.html
- [`allLimit`]http://suguru03.github.io/neo-async/doc/async.everyLimit.html -> [`every`]http://suguru03.github.io/neo-async/doc/async.everyLimit.html
- [`concat`]http://suguru03.github.io/neo-async/doc/async.concat.html
- [`concatSeries`]http://suguru03.github.io/neo-async/doc/async.concatSeries.html
- [`concatLimit`]http://suguru03.github.io/neo-async/doc/async.concatLimit.html *

### Control Flow

- [`parallel`]http://suguru03.github.io/neo-async/doc/async.parallel.html
- [`series`]http://suguru03.github.io/neo-async/doc/async.series.html
- [`parallelLimit`]http://suguru03.github.io/neo-async/doc/async.series.html
- [`tryEach`]http://suguru03.github.io/neo-async/doc/async.tryEach.html
- [`waterfall`]http://suguru03.github.io/neo-async/doc/async.waterfall.html
- [`angelFall`]http://suguru03.github.io/neo-async/doc/async.angelFall.html *
- [`angelfall`]http://suguru03.github.io/neo-async/doc/async.angelFall.html -> [`angelFall`]http://suguru03.github.io/neo-async/doc/async.angelFall.html *
- [`whilst`]#whilst
- [`doWhilst`]#doWhilst
- [`until`]#until
- [`doUntil`]#doUntil
- [`during`]#during
- [`doDuring`]#doDuring
- [`forever`]#forever
- [`compose`]#compose
- [`seq`]#seq
- [`applyEach`]#applyEach
- [`applyEachSeries`]#applyEachSeries
- [`queue`]#queue
- [`priorityQueue`]#priorityQueue
- [`cargo`]#cargo
- [`auto`]#auto
- [`autoInject`]#autoInject
- [`retry`]#retry
- [`retryable`]#retryable
- [`iterator`]#iterator
- [`times`]http://suguru03.github.io/neo-async/doc/async.times.html
- [`timesSeries`]http://suguru03.github.io/neo-async/doc/async.timesSeries.html
- [`timesLimit`]http://suguru03.github.io/neo-async/doc/async.timesLimit.html
- [`race`]#race

### Utils
- [`apply`]#apply
- [`setImmediate`]#setImmediate
- [`nextTick`]#nextTick
- [`memoize`]#memoize
- [`unmemoize`]#unmemoize
- [`ensureAsync`]#ensureAsync
- [`constant`]#constant
- [`asyncify`]#asyncify
- [`wrapSync`]#asyncify -> [`asyncify`]#asyncify
- [`log`]#log
- [`dir`]#dir
- [`timeout`]http://suguru03.github.io/neo-async/doc/async.timeout.html
- [`reflect`]#reflect
- [`reflectAll`]#reflectAll
- [`createLogger`]#createLogger

## Mode
- [`safe`]#safe *
- [`fast`]#fast *

## Benchmark

[Benchmark: Async vs Neo-Async](http://suguru03.hatenablog.com/entry/2016/06/10/135559)

### How to check

```bash
$ node perf
```

### Environment

* Darwin 17.3.0 x64
* Node.js v8.9.4
* async v2.6.0
* neo-async v2.5.0
* benchmark v2.1.4

### Result

The value is the ratio (Neo-Async/Async) of the average speed.

#### Collections
|function|benchmark|
|---|--:|
|each/forEach|2.43|
|eachSeries/forEachSeries|1.75|
|eachLimit/forEachLimit|1.68|
|eachOf|3.29|
|eachOfSeries|1.50|
|eachOfLimit|1.59|
|map|3.95|
|mapSeries|1.81|
|mapLimit|1.27|
|mapValues|2.73|
|mapValuesSeries|1.59|
|mapValuesLimit|1.23|
|filter|3.00|
|filterSeries|1.74|
|filterLimit|1.17|
|reject|4.59|
|rejectSeries|2.31|
|rejectLimit|1.58|
|detect|4.30|
|detectSeries|1.86|
|detectLimit|1.32|
|reduce|1.82|
|transform|2.46|
|sortBy|4.08|
|some|2.19|
|someSeries|1.83|
|someLimit|1.32|
|every|2.09|
|everySeries|1.84|
|everyLimit|1.35|
|concat|3.79|
|concatSeries|4.45|

#### Control Flow
|funciton|benchmark|
|---|--:|
|parallel|2.93|
|series|1.96|
|waterfall|1.29|
|whilst|1.00|
|doWhilst|1.12|
|until|1.12|
|doUntil|1.12|
|during|1.18|
|doDuring|2.42|
|times|4.25|
|auto|1.97|


## License
[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuguru03%2Fneo-async.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuguru03%2Fneo-async?ref=badge_large)