|
|
- <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>
- </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|
|