Socket
Socket
Sign inDemoInstall

async

Package Overview
Dependencies
1
Maintainers
4
Versions
92
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

    async

Higher-order functions and common patterns for asynchronous code


Version published
Weekly downloads
51M
decreased by-1.31%
Maintainers
4
Install size
1.73 MB
Created
Weekly downloads
 

Package description

What is async?

The async npm package provides utility functions for working with asynchronous JavaScript. It offers a variety of powerful control flow functions and utilities to work with asynchronous operations, helping to manage callbacks, reduce boilerplate code, and increase readability.

What are async's main functionalities?

Control Flow

Execute an array of functions in series, each one running once the previous function has completed. If any functions in the series pass an error to its callback, no more functions are run, and the main callback is immediately called with the value of the error.

async.series([
  function(callback) { 
    // do some stuff ...
    callback(null, 'one'); 
  },
  function(callback) { 
    // do some more stuff ...
    callback(null, 'two'); 
  }
],
function(err, results) {
  // results is now equal to ['one', 'two']
});

Collections

Apply a function to each item in a collection and collect the results. For example, you can use `async.map` to get the file stats for an array of file names.

async.map(['file1','file2','file3'], fs.stat, function(err, results) {
  // results is now an array of stats for each file
});

Utilities

Repeatedly call a function a set number of times and collect the results. It's useful for seeding databases, among other things.

async.times(5, function(n, next) {
  createUser(n, function(err, user) {
    next(err, user);
  });
}, function(err, users) {
  // we should now have 5 users
});

Other packages similar to async

Changelog

Source

v2.0.0

Lots of changes here!

First and foremost, we have a slick new site for docs. Special thanks to @hargasinski for his work converting our old docs to jsdoc format and implementing the new website. Also huge ups to @ivanseidel for designing our new logo. It was a long process for both of these tasks, but I think these changes turned out extraordinary well.

The biggest feature is modularization. You can now require("async/series") to only require the series function. Every Async library function is available this way. You still can require("async") to require the entire library, like you could do before.

We also provide Async as a collection of ES2015 modules. You can now import {each} from 'async-es' or import waterfall from 'async-es/waterfall'. If you are using only a few Async functions, and are using a ES bundler such as Rollup, this can significantly lower your build size.

Major thanks to @Kikobeats, @aearly and @megawac for doing the majority of the modularization work, as well as @jdalton and @Rich-Harris for advisory work on the general modularization strategy.

Another one of the general themes of the 2.0 release is standardization of what an "async" function is. We are now more strictly following the node-style continuation passing style. That is, an async function is a function that:

  1. Takes a variable number of arguments
  2. The last argument is always a callback
  3. The callback can accept any number of arguments
  4. The first argument passed to the callback will be treated as an error result, if the argument is truthy
  5. Any number of result arguments can be passed after the "error" argument
  6. The callback is called once and exactly once, either on the same tick or later tick of the JavaScript event loop.

There were several cases where Async accepted some functions that did not strictly have these properties, most notably auto, every, some, filter, reject and detect.

Another theme is performance. We have eliminated internal deferrals in all cases where they make sense. For example, in waterfall and auto, there was a setImmediate between each task -- these deferrals have been removed. A setImmediate call can add up to 1ms of delay. This might not seem like a lot, but it can add up if you are using many Async functions in the course of processing a HTTP request, for example. Nearly all asynchronous functions that do I/O already have some sort of deferral built in, so the extra deferral is unnecessary. The trade-off of this change is removing our built-in stack-overflow defense. Many synchronous callback calls in series can quickly overflow the JS call stack. If you do have a function that is sometimes synchronous (calling its callback on the same tick), and are running into stack overflows, wrap it with async.ensureAsync().

Another big performance win has been re-implementing queue, cargo, and priorityQueue with doubly linked lists instead of arrays. This has lead to queues being an order of magnitude faster on large sets of tasks.

New Features

  • Async is now modularized. Individual functions can be require()d from the main package. (require('async/auto')) (#984, #996)
  • Async is also available as a collection of ES2015 modules in the new async-es package. (import {forEachSeries} from 'async-es') (#984, #996)
  • Added race, analogous to Promise.race(). It will run an array of async tasks in parallel and will call its callback with the result of the first task to respond. (#568, #1038)
  • Collection methods now accept ES2015 iterators. Maps, Sets, and anything that implements the iterator spec can now be passed directly to each, map, parallel, etc.. (#579, #839, #1074)
  • Added mapValues, for mapping over the properties of an object and returning an object with the same keys. (#1157, #1177)
  • Added timeout, a wrapper for an async function that will make the task time-out after the specified time. (#1007, #1027)
  • Added reflect and reflectAll, analagous to Promise.reflect(), a wrapper for async tasks that always succeeds, by gathering results and errors into an object. (#942, #1012, #1095)
  • constant supports dynamic arguments -- it will now always use its last argument as the callback. (#1016, #1052)
  • setImmediate and nextTick now support arguments to partially apply to the deferred function, like the node-native versions do. (#940, #1053)
  • auto now supports resolving cyclic dependencies using Kahn's algorithm (#1140).
  • Added autoInject, a relative of auto that automatically spreads a task's dependencies as arguments to the task function. (#608, #1055, #1099, #1100)
  • You can now limit the concurrency of auto tasks. (#635, #637)
  • Added retryable, a relative of retry that wraps an async function, making it retry when called. (#1058)
  • retry now supports specifying a function that determines the next time interval, useful for exponential backoff, logging and other retry strategies. (#1161)
  • retry will now pass all of the arguments the task function was resolved with to the callback (#1231).
  • Added q.unsaturated -- callback called when a queue's number of running workers falls below a threshold. (#868, #1030, #1033, #1034)
  • Added q.error -- a callback called whenever a queue task calls its callback with an error. (#1170)
  • applyEach and applyEachSeries now pass results to the final callback. (#1088)

Breaking changes

  • Calling a callback more than once is considered an error, and an error will be thrown. This had an explicit breaking change in waterfall. If you were relying on this behavior, you should more accurately represent your control flow as an event emitter or stream. (#814, #815, #1048, #1050)
  • auto task functions now always take the callback as the last argument. If a task has dependencies, the results object will be passed as the first argument. To migrate old task functions, wrap them with _.flip (#1036, #1042)
  • Internal setImmediate calls have been refactored away. This may make existing flows vulnerable to stack overflows if you use many synchronous functions in series. Use ensureAsync to work around this. (#696, #704, #1049, #1050)
  • map used to return an object when iterating over an object. map now always returns an array, like in other libraries. The previous object behavior has been split out into mapValues. (#1157, #1177)
  • filter, reject, some, every, detect and their families like {METHOD}Series and {METHOD}Limit now expect an error as the first callback argument, rather than just a simple boolean. Pass null as the first argument, or use fs.access instead of fs.exists. (#118, #774, #1028, #1041)
  • {METHOD} and {METHOD}Series are now implemented in terms of {METHOD}Limit. This is a major internal simplification, and is not expected to cause many problems, but it does subtly affect how functions execute internally. (#778, #847)
  • retry's callback is now optional. Previously, omitting the callback would partially apply the function, meaning it could be passed directly as a task to series or auto. The partially applied "control-flow" behavior has been separated out into retryable. (#1054, #1058)
  • The test function for whilst, until, and during used to be passed non-error args from the iteratee function's callback, but this led to weirdness where the first call of the test function would be passed no args. We have made it so the test function is never passed extra arguments, and only the doWhilst, doUntil, and doDuring functions pass iteratee callback arguments to the test function (#1217, #1224)
  • The q.tasks array has been renamed q._tasks and is now implemented as a doubly linked list (DLL). Any code that used to interact with this array will need to be updated to either use the provided helpers or support DLLs (#1205).
  • The timing of the q.saturated() callback in a queue has been modified to better reflect when tasks pushed to the queue will start queueing. (#724, #1078)
  • Removed iterator method in favour of ES2015 iterator protocol which natively supports arrays (#1237)
  • Dropped support for Component, Jam, SPM, and Volo (#1175, ##176)

Bug Fixes

  • Improved handling of no dependency cases in auto & autoInject (#1147).
  • Fixed a bug where the callback generated by asyncify with Promises could resolve twice (#1197).
  • Fixed several documented optional callbacks not actually being optional (#1223).

Other

Thank you @aearly and @megawac for taking the lead on version 2 of async.


Readme

Source

Async Logo

Build Status via Travis CI NPM version Coverage Status Join the chat at https://gitter.im/caolan/async

Async is a utility module which provides straight-forward, powerful functions for working with asynchronous JavaScript. Although originally designed for use with Node.js and installable via npm install --save async, it can also be used directly in the browser.

For Documentation, visit http://caolan.github.io/async/

For Async v1.5.x documentation, go HERE

Keywords

FAQs

Last updated on 13 Jul 2016

Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc