{"id":13548852,"url":"https://github.com/suguru03/neo-async","last_synced_at":"2025-10-22T21:19:13.088Z","repository":{"id":23659606,"uuid":"27030361","full_name":"suguru03/neo-async","owner":"suguru03","description":"Neo-Async is thought to be used as a drop-in replacement for Async, it almost fully covers its functionality and runs faster","archived":false,"fork":false,"pushed_at":"2022-12-02T17:22:37.000Z","size":3953,"stargazers_count":653,"open_issues_count":15,"forks_count":36,"subscribers_count":11,"default_branch":"master","last_synced_at":"2025-03-31T12:39:34.243Z","etag":null,"topics":["async","javascript","neo-async","nodejs"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/suguru03.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-11-23T11:32:34.000Z","updated_at":"2025-03-28T01:04:51.000Z","dependencies_parsed_at":"2022-08-31T00:01:12.849Z","dependency_job_id":null,"html_url":"https://github.com/suguru03/neo-async","commit_stats":null,"previous_names":[],"tags_count":79,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suguru03%2Fneo-async","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suguru03%2Fneo-async/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suguru03%2Fneo-async/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suguru03%2Fneo-async/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/suguru03","download_url":"https://codeload.github.com/suguru03/neo-async/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246635972,"owners_count":20809333,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["async","javascript","neo-async","nodejs"],"created_at":"2024-08-01T12:01:15.171Z","updated_at":"2025-10-22T21:19:08.034Z","avatar_url":"https://github.com/suguru03.png","language":"JavaScript","funding_links":[],"categories":["JavaScript","Libraries"],"sub_categories":["[Javascript](https://developer.mozilla.org/en-US/docs/Web/JavaScript)"],"readme":"\u003ch1 align=\"center\"\u003eNeo-Async\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/wiki/suguru03/neo-async/images/neo_async_v2.png\" width=\"250px\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.npmjs.com/package/neo-async\"\u003e\u003cimg alt=\"npm\" src=\"https://img.shields.io/npm/v/neo-async.svg\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://travis-ci.org/suguru03/neo-async\"\u003e\u003cimg alt=\"Travis Status\" src=\"https://img.shields.io/travis/suguru03/neo-async.svg\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://codecov.io/gh/suguru03/neo-async\"\u003e\u003cimg alt=\"Coverage Status\" src=\"https://img.shields.io/codecov/c/github/suguru03/neo-async/master.svg\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/neo-async\"\u003e\u003cimg alt=\"download\" src=\"https://img.shields.io/npm/dm/neo-async.svg\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://lgtm.com/projects/g/suguru03/neo-async/context:javascript\"\u003e\u003cimg src=\"https://img.shields.io/lgtm/grade/javascript/g/suguru03/neo-async.svg?logo=lgtm\u0026logoWidth=18\" alt=\"Code Quality: Javascript\" height=\"18\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://lgtm.com/projects/g/suguru03/neo-async/alerts\"\u003e\u003cimg src=\"https://img.shields.io/lgtm/alerts/g/suguru03/neo-async.svg?logo=lgtm\u0026logoWidth=18\" alt=\"Total Alerts\" height=\"18\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://app.fossa.io/projects/git%2Bgithub.com%2Fsuguru03%2Fneo-async?ref=badge_shield\"\u003e\u003cimg src=\"https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuguru03%2Fneo-async.svg?type=shield\" alt=\"FOSSA\" height=\"18\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\nNeo-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).\n\nBenchmark is [here](#benchmark)!\n\nBluebird's benchmark is [here](https://github.com/suguru03/bluebird/tree/aigle/benchmark)!\n\n## Code Coverage\n![coverage](https://raw.githubusercontent.com/wiki/suguru03/neo-async/images/coverage.png)\n\n## Installation\n\n### In a browser\n```html\n\u003cscript src=\"async.min.js\"\u003e\u003c/script\u003e\n```\n\n### In an AMD loader\n```js\nrequire(['async'], function(async) {});\n```\n\n### Promise and async/await\n\nI recommend to use [`Aigle`](https://github.com/suguru03/aigle).\n\nIt is optimized for Promise handling and has almost the same functionality as `neo-async`.\n\n### Node.js\n\n#### standard\n\n```bash\n$ npm install neo-async\n```\n```js\nvar async = require('neo-async');\n```\n\n#### replacement\n```bash\n$ npm install neo-async\n$ ln -s ./node_modules/neo-async ./node_modules/async\n```\n```js\nvar async = require('async');\n```\n\n### Bower\n\n```bash\nbower install neo-async\n```\n\n## Feature\n\n[JSDoc](http://suguru03.github.io/neo-async/doc/async.html)\n\n\\* not in Async\n\n### Collections\n\n- [`each`](http://suguru03.github.io/neo-async/doc/async.each.html)\n- [`eachSeries`](http://suguru03.github.io/neo-async/doc/async.eachSeries.html)\n- [`eachLimit`](http://suguru03.github.io/neo-async/doc/async.eachLimit.html)\n- [`forEach`](http://suguru03.github.io/neo-async/doc/async.each.html) -\u003e [`each`](http://suguru03.github.io/neo-async/doc/async.each.html)\n- [`forEachSeries`](http://suguru03.github.io/neo-async/doc/async.eachSeries.html) -\u003e [`eachSeries`](http://suguru03.github.io/neo-async/doc/async.eachSeries.html)\n- [`forEachLimit`](http://suguru03.github.io/neo-async/doc/async.eachLimit.html) -\u003e [`eachLimit`](http://suguru03.github.io/neo-async/doc/async.eachLimit.html)\n- [`eachOf`](http://suguru03.github.io/neo-async/doc/async.each.html) -\u003e [`each`](http://suguru03.github.io/neo-async/doc/async.each.html)\n- [`eachOfSeries`](http://suguru03.github.io/neo-async/doc/async.eachSeries.html) -\u003e [`eachSeries`](http://suguru03.github.io/neo-async/doc/async.eachSeries.html)\n- [`eachOfLimit`](http://suguru03.github.io/neo-async/doc/async.eachLimit.html) -\u003e [`eachLimit`](http://suguru03.github.io/neo-async/doc/async.eachLimit.html)\n- [`forEachOf`](http://suguru03.github.io/neo-async/doc/async.each.html) -\u003e [`each`](http://suguru03.github.io/neo-async/doc/async.each.html)\n- [`forEachOfSeries`](http://suguru03.github.io/neo-async/doc/async.eachSeries.html) -\u003e [`eachSeries`](http://suguru03.github.io/neo-async/doc/async.eachSeries.html)\n- [`eachOfLimit`](http://suguru03.github.io/neo-async/doc/async.eachLimit.html) -\u003e [`forEachLimit`](http://suguru03.github.io/neo-async/doc/async.eachLimit.html)\n- [`map`](http://suguru03.github.io/neo-async/doc/async.map.html)\n- [`mapSeries`](http://suguru03.github.io/neo-async/doc/async.mapSeries.html)\n- [`mapLimit`](http://suguru03.github.io/neo-async/doc/async.mapLimit.html)\n- [`mapValues`](http://suguru03.github.io/neo-async/doc/async.mapValues.html)\n- [`mapValuesSeries`](http://suguru03.github.io/neo-async/doc/async.mapValuesSeries.html)\n- [`mapValuesLimit`](http://suguru03.github.io/neo-async/doc/async.mapValuesLimit.html)\n- [`filter`](http://suguru03.github.io/neo-async/doc/async.filter.html)\n- [`filterSeries`](http://suguru03.github.io/neo-async/doc/async.filterSeries.html)\n- [`filterLimit`](http://suguru03.github.io/neo-async/doc/async.filterLimit.html)\n- [`select`](http://suguru03.github.io/neo-async/doc/async.filter.html) -\u003e [`filter`](http://suguru03.github.io/neo-async/doc/async.filter.html)\n- [`selectSeries`](http://suguru03.github.io/neo-async/doc/async.filterSeries.html) -\u003e [`filterSeries`](http://suguru03.github.io/neo-async/doc/async.filterSeries.html)\n- [`selectLimit`](http://suguru03.github.io/neo-async/doc/async.filterLimit.html) -\u003e [`filterLimit`](http://suguru03.github.io/neo-async/doc/async.filterLimit.html)\n- [`reject`](http://suguru03.github.io/neo-async/doc/async.reject.html)\n- [`rejectSeries`](http://suguru03.github.io/neo-async/doc/async.rejectSeries.html)\n- [`rejectLimit`](http://suguru03.github.io/neo-async/doc/async.rejectLimit.html)\n- [`detect`](http://suguru03.github.io/neo-async/doc/async.detect.html)\n- [`detectSeries`](http://suguru03.github.io/neo-async/doc/async.detectSeries.html)\n- [`detectLimit`](http://suguru03.github.io/neo-async/doc/async.detectLimit.html)\n- [`find`](http://suguru03.github.io/neo-async/doc/async.detect.html) -\u003e [`detect`](http://suguru03.github.io/neo-async/doc/async.detect.html)\n- [`findSeries`](http://suguru03.github.io/neo-async/doc/async.detectSeries.html) -\u003e [`detectSeries`](http://suguru03.github.io/neo-async/doc/async.detectSeries.html)\n- [`findLimit`](http://suguru03.github.io/neo-async/doc/async.detectLimit.html) -\u003e [`detectLimit`](http://suguru03.github.io/neo-async/doc/async.detectLimit.html)\n- [`pick`](http://suguru03.github.io/neo-async/doc/async.pick.html) *\n- [`pickSeries`](http://suguru03.github.io/neo-async/doc/async.pickSeries.html) *\n- [`pickLimit`](http://suguru03.github.io/neo-async/doc/async.pickLimit.html) *\n- [`omit`](http://suguru03.github.io/neo-async/doc/async.omit.html) *\n- [`omitSeries`](http://suguru03.github.io/neo-async/doc/async.omitSeries.html) *\n- [`omitLimit`](http://suguru03.github.io/neo-async/doc/async.omitLimit.html) *\n- [`reduce`](http://suguru03.github.io/neo-async/doc/async.reduce.html)\n- [`inject`](http://suguru03.github.io/neo-async/doc/async.reduce.html) -\u003e [`reduce`](http://suguru03.github.io/neo-async/doc/async.reduce.html)\n- [`foldl`](http://suguru03.github.io/neo-async/doc/async.reduce.html) -\u003e [`reduce`](http://suguru03.github.io/neo-async/doc/async.reduce.html)\n- [`reduceRight`](http://suguru03.github.io/neo-async/doc/async.reduceRight.html)\n- [`foldr`](http://suguru03.github.io/neo-async/doc/async.reduceRight.html) -\u003e [`reduceRight`](http://suguru03.github.io/neo-async/doc/async.reduceRight.html)\n- [`transform`](http://suguru03.github.io/neo-async/doc/async.transform.html)\n- [`transformSeries`](http://suguru03.github.io/neo-async/doc/async.transformSeries.html) *\n- [`transformLimit`](http://suguru03.github.io/neo-async/doc/async.transformLimit.html) *\n- [`sortBy`](http://suguru03.github.io/neo-async/doc/async.sortBy.html)\n- [`sortBySeries`](http://suguru03.github.io/neo-async/doc/async.sortBySeries.html) *\n- [`sortByLimit`](http://suguru03.github.io/neo-async/doc/async.sortByLimit.html) *\n- [`some`](http://suguru03.github.io/neo-async/doc/async.some.html)\n- [`someSeries`](http://suguru03.github.io/neo-async/doc/async.someSeries.html)\n- [`someLimit`](http://suguru03.github.io/neo-async/doc/async.someLimit.html)\n- [`any`](http://suguru03.github.io/neo-async/doc/async.some.html) -\u003e [`some`](http://suguru03.github.io/neo-async/doc/async.some.html)\n- [`anySeries`](http://suguru03.github.io/neo-async/doc/async.someSeries.html) -\u003e [`someSeries`](http://suguru03.github.io/neo-async/doc/async.someSeries.html)\n- [`anyLimit`](http://suguru03.github.io/neo-async/doc/async.someLimit.html) -\u003e [`someLimit`](http://suguru03.github.io/neo-async/doc/async.someLimit.html)\n- [`every`](http://suguru03.github.io/neo-async/doc/async.every.html)\n- [`everySeries`](http://suguru03.github.io/neo-async/doc/async.everySeries.html)\n- [`everyLimit`](http://suguru03.github.io/neo-async/doc/async.everyLimit.html)\n- [`all`](http://suguru03.github.io/neo-async/doc/async.every.html) -\u003e [`every`](http://suguru03.github.io/neo-async/doc/async.every.html)\n- [`allSeries`](http://suguru03.github.io/neo-async/doc/async.everySeries.html) -\u003e [`every`](http://suguru03.github.io/neo-async/doc/async.everySeries.html)\n- [`allLimit`](http://suguru03.github.io/neo-async/doc/async.everyLimit.html) -\u003e [`every`](http://suguru03.github.io/neo-async/doc/async.everyLimit.html)\n- [`concat`](http://suguru03.github.io/neo-async/doc/async.concat.html)\n- [`concatSeries`](http://suguru03.github.io/neo-async/doc/async.concatSeries.html)\n- [`concatLimit`](http://suguru03.github.io/neo-async/doc/async.concatLimit.html) *\n\n### Control Flow\n\n- [`parallel`](http://suguru03.github.io/neo-async/doc/async.parallel.html)\n- [`series`](http://suguru03.github.io/neo-async/doc/async.series.html)\n- [`parallelLimit`](http://suguru03.github.io/neo-async/doc/async.parallelLimit.html)\n- [`tryEach`](http://suguru03.github.io/neo-async/doc/async.tryEach.html)\n- [`waterfall`](http://suguru03.github.io/neo-async/doc/async.waterfall.html)\n- [`angelFall`](http://suguru03.github.io/neo-async/doc/async.angelFall.html) *\n- [`angelfall`](http://suguru03.github.io/neo-async/doc/async.angelFall.html) -\u003e [`angelFall`](http://suguru03.github.io/neo-async/doc/async.angelFall.html) *\n- [`whilst`](#whilst)\n- [`doWhilst`](#doWhilst)\n- [`until`](#until)\n- [`doUntil`](#doUntil)\n- [`during`](#during)\n- [`doDuring`](#doDuring)\n- [`forever`](#forever)\n- [`compose`](#compose)\n- [`seq`](#seq)\n- [`applyEach`](#applyEach)\n- [`applyEachSeries`](#applyEachSeries)\n- [`queue`](#queue)\n- [`priorityQueue`](#priorityQueue)\n- [`cargo`](#cargo)\n- [`auto`](#auto)\n- [`autoInject`](#autoInject)\n- [`retry`](#retry)\n- [`retryable`](#retryable)\n- [`iterator`](#iterator)\n- [`times`](http://suguru03.github.io/neo-async/doc/async.times.html)\n- [`timesSeries`](http://suguru03.github.io/neo-async/doc/async.timesSeries.html)\n- [`timesLimit`](http://suguru03.github.io/neo-async/doc/async.timesLimit.html)\n- [`race`](#race)\n\n### Utils\n- [`apply`](#apply)\n- [`setImmediate`](#setImmediate)\n- [`nextTick`](#nextTick)\n- [`memoize`](#memoize)\n- [`unmemoize`](#unmemoize)\n- [`ensureAsync`](#ensureAsync)\n- [`constant`](#constant)\n- [`asyncify`](#asyncify)\n- [`wrapSync`](#asyncify) -\u003e [`asyncify`](#asyncify)\n- [`log`](#log)\n- [`dir`](#dir)\n- [`timeout`](http://suguru03.github.io/neo-async/doc/async.timeout.html)\n- [`reflect`](#reflect)\n- [`reflectAll`](#reflectAll)\n- [`createLogger`](#createLogger)\n\n## Mode\n- [`safe`](#safe) *\n- [`fast`](#fast) *\n\n## Benchmark\n\n[Benchmark: Async vs Neo-Async](http://suguru03.hatenablog.com/entry/2016/06/10/135559)\n\n### How to check\n\n```bash\n$ node perf\n```\n\n### Environment\n\n* Darwin 17.3.0 x64\n* Node.js v8.9.4\n* async v2.6.0\n* neo-async v2.5.0\n* benchmark v2.1.4\n\n### Result\n\nThe value is the ratio (Neo-Async/Async) of the average speed.\n\n#### Collections\n|function|benchmark|\n|---|--:|\n|each/forEach|2.43|\n|eachSeries/forEachSeries|1.75|\n|eachLimit/forEachLimit|1.68|\n|eachOf|3.29|\n|eachOfSeries|1.50|\n|eachOfLimit|1.59|\n|map|3.95|\n|mapSeries|1.81|\n|mapLimit|1.27|\n|mapValues|2.73|\n|mapValuesSeries|1.59|\n|mapValuesLimit|1.23|\n|filter|3.00|\n|filterSeries|1.74|\n|filterLimit|1.17|\n|reject|4.59|\n|rejectSeries|2.31|\n|rejectLimit|1.58|\n|detect|4.30|\n|detectSeries|1.86|\n|detectLimit|1.32|\n|reduce|1.82|\n|transform|2.46|\n|sortBy|4.08|\n|some|2.19|\n|someSeries|1.83|\n|someLimit|1.32|\n|every|2.09|\n|everySeries|1.84|\n|everyLimit|1.35|\n|concat|3.79|\n|concatSeries|4.45|\n\n#### Control Flow\n|funciton|benchmark|\n|---|--:|\n|parallel|2.93|\n|series|1.96|\n|waterfall|1.29|\n|whilst|1.00|\n|doWhilst|1.12|\n|until|1.12|\n|doUntil|1.12|\n|during|1.18|\n|doDuring|2.42|\n|times|4.25|\n|auto|1.97|\n\n\n## License\n[![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)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsuguru03%2Fneo-async","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsuguru03%2Fneo-async","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsuguru03%2Fneo-async/lists"}