Comparing version 0.2.10 to 0.3.0
@@ -0,1 +1,2 @@ | ||
/*jshint onevar: false, indent:4 */ | ||
/*global setImmediate: false, setTimeout: false, console: false */ | ||
@@ -30,2 +31,6 @@ (function () { | ||
var _isArray = Array.isArray || function (obj) { | ||
return toString.call(obj) === '[object Array]'; | ||
}; | ||
var _each = function (arr, iterator) { | ||
@@ -112,15 +117,16 @@ if (arr.forEach) { | ||
_each(arr, function (x) { | ||
iterator(x, only_once(function (err) { | ||
if (err) { | ||
callback(err); | ||
callback = function () {}; | ||
} | ||
else { | ||
completed += 1; | ||
if (completed >= arr.length) { | ||
callback(null); | ||
} | ||
} | ||
})); | ||
iterator(x, only_once(done) ); | ||
}); | ||
function done(err) { | ||
if (err) { | ||
callback(err); | ||
callback = function () {}; | ||
} | ||
else { | ||
completed += 1; | ||
if (completed >= arr.length) { | ||
callback(null); | ||
} | ||
} | ||
} | ||
}; | ||
@@ -427,4 +433,7 @@ async.forEach = async.each; | ||
if (_keys(results).length === keys.length) { | ||
callback(null, results); | ||
var theCallback = callback; | ||
// prevent final callback from calling itself if it errors | ||
callback = function () {}; | ||
theCallback(null, results); | ||
} | ||
@@ -478,3 +487,3 @@ }); | ||
callback = callback || function () {}; | ||
if (tasks.constructor !== Array) { | ||
if (!_isArray(tasks)) { | ||
var err = new Error('First argument to waterfall must be an array of functions'); | ||
@@ -512,3 +521,3 @@ return callback(err); | ||
callback = callback || function () {}; | ||
if (tasks.constructor === Array) { | ||
if (_isArray(tasks)) { | ||
eachfn.map(tasks, function (fn, callback) { | ||
@@ -553,3 +562,3 @@ if (fn) { | ||
callback = callback || function () {}; | ||
if (tasks.constructor === Array) { | ||
if (_isArray(tasks)) { | ||
async.mapSeries(tasks, function (fn, callback) { | ||
@@ -642,3 +651,4 @@ if (fn) { | ||
} | ||
if (test()) { | ||
var args = Array.prototype.slice.call(arguments, 1); | ||
if (test.apply(null, args)) { | ||
async.doWhilst(iterator, test, callback); | ||
@@ -671,3 +681,4 @@ } | ||
} | ||
if (!test()) { | ||
var args = Array.prototype.slice.call(arguments, 1); | ||
if (!test.apply(null, args)) { | ||
async.doUntil(iterator, test, callback); | ||
@@ -686,5 +697,13 @@ } | ||
function _insert(q, data, pos, callback) { | ||
if(data.constructor !== Array) { | ||
if (!_isArray(data)) { | ||
data = [data]; | ||
} | ||
if(data.length == 0) { | ||
// call drain immediately if there are no tasks | ||
return async.setImmediate(function() { | ||
if (q.drain) { | ||
q.drain(); | ||
} | ||
}); | ||
} | ||
_each(data, function(task) { | ||
@@ -702,3 +721,3 @@ var item = { | ||
if (q.saturated && q.tasks.length === concurrency) { | ||
if (q.saturated && q.tasks.length === q.concurrency) { | ||
q.saturated(); | ||
@@ -764,4 +783,5 @@ } | ||
drain: null, | ||
drained: true, | ||
push: function (data, callback) { | ||
if(data.constructor !== Array) { | ||
if (!_isArray(data)) { | ||
data = [data]; | ||
@@ -774,2 +794,3 @@ } | ||
}); | ||
cargo.drained = false; | ||
if (cargo.saturated && tasks.length === payload) { | ||
@@ -784,3 +805,4 @@ cargo.saturated(); | ||
if (tasks.length === 0) { | ||
if(cargo.drain) cargo.drain(); | ||
if(cargo.drain && !cargo.drained) cargo.drain(); | ||
cargo.drained = true; | ||
return; | ||
@@ -791,3 +813,3 @@ } | ||
? tasks.splice(0, payload) | ||
: tasks.splice(0); | ||
: tasks.splice(0, tasks.length); | ||
@@ -860,3 +882,5 @@ var ds = _map(ts, function (task) { | ||
if (key in memo) { | ||
callback.apply(null, memo[key]); | ||
async.nextTick(function () { | ||
callback.apply(null, memo[key]); | ||
}); | ||
} | ||
@@ -905,4 +929,4 @@ else if (key in queues) { | ||
async.compose = function (/* functions... */) { | ||
var fns = Array.prototype.reverse.call(arguments); | ||
async.seq = function (/* functions... */) { | ||
var fns = arguments; | ||
return function () { | ||
@@ -925,2 +949,6 @@ var that = this; | ||
async.compose = function (/* functions... */) { | ||
return async.seq.apply(null, Array.prototype.reverse.call(arguments)); | ||
}; | ||
var _applyEach = function (eachfn, fns /*args...*/) { | ||
@@ -960,4 +988,8 @@ var go = function () { | ||
// Node.js | ||
if (typeof module !== 'undefined' && module.exports) { | ||
module.exports = async; | ||
} | ||
// AMD / RequireJS | ||
if (typeof define !== 'undefined' && define.amd) { | ||
else if (typeof define !== 'undefined' && define.amd) { | ||
define([], function () { | ||
@@ -967,6 +999,2 @@ return async; | ||
} | ||
// Node.js | ||
else if (typeof module !== 'undefined' && module.exports) { | ||
module.exports = async; | ||
} | ||
// included directly via <script> tag | ||
@@ -973,0 +1001,0 @@ else { |
@@ -6,3 +6,3 @@ { | ||
"author": "Caolan McMahon", | ||
"version": "0.2.10", | ||
"version": "0.3.0", | ||
"repository" : { | ||
@@ -9,0 +9,0 @@ "type" : "git", |
892
README.md
# Async.js | ||
[![Build Status via Travis CI](https://travis-ci.org/caolan/async.png?branch=master)](https://travis-ci.org/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](http://nodejs.org), it can also be used directly in the | ||
use with [Node.js](http://nodejs.org), it can also be used directly in the | ||
browser. Also supports [component](https://github.com/component/component). | ||
Async provides around 20 functions that include the usual 'functional' | ||
suspects (map, reduce, filter, each…) as well as some common patterns | ||
for asynchronous control flow (parallel, series, waterfall…). All these | ||
functions assume you follow the node.js convention of providing a single | ||
callback as the last argument of your async function. | ||
suspects (`map`, `reduce`, `filter`, `each`…) as well as some common patterns | ||
for asynchronous control flow (`parallel`, `series`, `waterfall`…). All these | ||
functions assume you follow the Node.js convention of providing a single | ||
callback as the last argument of your `async` function. | ||
@@ -45,4 +48,4 @@ | ||
This section is really about bind, not about async. If you are wondering how to | ||
make async execute your iterators in a given context, or are confused as to why | ||
This section is really about `bind`, not about `async`. If you are wondering how to | ||
make `async` execute your iterators in a given context, or are confused as to why | ||
a method of another library isn't working as an iterator, study this example: | ||
@@ -82,3 +85,3 @@ | ||
[GitHub](http://github.com/caolan/async). | ||
Alternatively, you can install using Node Package Manager (npm): | ||
Alternatively, you can install using Node Package Manager (`npm`): | ||
@@ -91,4 +94,6 @@ npm install async | ||
So far it's been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage: | ||
So far it's been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. | ||
Usage: | ||
```html | ||
@@ -109,52 +114,53 @@ <script type="text/javascript" src="async.js"></script> | ||
* [each](#each) | ||
* [eachSeries](#eachSeries) | ||
* [eachLimit](#eachLimit) | ||
* [map](#map) | ||
* [mapSeries](#mapSeries) | ||
* [mapLimit](#mapLimit) | ||
* [filter](#filter) | ||
* [filterSeries](#filterSeries) | ||
* [reject](#reject) | ||
* [rejectSeries](#rejectSeries) | ||
* [reduce](#reduce) | ||
* [reduceRight](#reduceRight) | ||
* [detect](#detect) | ||
* [detectSeries](#detectSeries) | ||
* [sortBy](#sortBy) | ||
* [some](#some) | ||
* [every](#every) | ||
* [concat](#concat) | ||
* [concatSeries](#concatSeries) | ||
* [`each`](#each) | ||
* [`eachSeries`](#eachSeries) | ||
* [`eachLimit`](#eachLimit) | ||
* [`map`](#map) | ||
* [`mapSeries`](#mapSeries) | ||
* [`mapLimit`](#mapLimit) | ||
* [`filter`](#filter) | ||
* [`filterSeries`](#filterSeries) | ||
* [`reject`](#reject) | ||
* [`rejectSeries`](#rejectSeries) | ||
* [`reduce`](#reduce) | ||
* [`reduceRight`](#reduceRight) | ||
* [`detect`](#detect) | ||
* [`detectSeries`](#detectSeries) | ||
* [`sortBy`](#sortBy) | ||
* [`some`](#some) | ||
* [`every`](#every) | ||
* [`concat`](#concat) | ||
* [`concatSeries`](#concatSeries) | ||
### Control Flow | ||
* [series](#series) | ||
* [parallel](#parallel) | ||
* [parallelLimit](#parallellimittasks-limit-callback) | ||
* [whilst](#whilst) | ||
* [doWhilst](#doWhilst) | ||
* [until](#until) | ||
* [doUntil](#doUntil) | ||
* [forever](#forever) | ||
* [waterfall](#waterfall) | ||
* [compose](#compose) | ||
* [applyEach](#applyEach) | ||
* [applyEachSeries](#applyEachSeries) | ||
* [queue](#queue) | ||
* [cargo](#cargo) | ||
* [auto](#auto) | ||
* [iterator](#iterator) | ||
* [apply](#apply) | ||
* [nextTick](#nextTick) | ||
* [times](#times) | ||
* [timesSeries](#timesSeries) | ||
* [`series`](#series) | ||
* [`parallel`](#parallel) | ||
* [`parallelLimit`](#parallellimittasks-limit-callback) | ||
* [`whilst`](#whilst) | ||
* [`doWhilst`](#doWhilst) | ||
* [`until`](#until) | ||
* [`doUntil`](#doUntil) | ||
* [`forever`](#forever) | ||
* [`waterfall`](#waterfall) | ||
* [`compose`](#compose) | ||
* [`seq`](#seq) | ||
* [`applyEach`](#applyEach) | ||
* [`applyEachSeries`](#applyEachSeries) | ||
* [`queue`](#queue) | ||
* [`cargo`](#cargo) | ||
* [`auto`](#auto) | ||
* [`iterator`](#iterator) | ||
* [`apply`](#apply) | ||
* [`nextTick`](#nextTick) | ||
* [`times`](#times) | ||
* [`timesSeries`](#timesSeries) | ||
### Utils | ||
* [memoize](#memoize) | ||
* [unmemoize](#unmemoize) | ||
* [log](#log) | ||
* [dir](#dir) | ||
* [noConflict](#noConflict) | ||
* [`memoize`](#memoize) | ||
* [`unmemoize`](#unmemoize) | ||
* [`log`](#log) | ||
* [`dir`](#dir) | ||
* [`noConflict`](#noConflict) | ||
@@ -168,8 +174,8 @@ | ||
Applies an iterator function to each item in an array, in parallel. | ||
The iterator is called with an item from the list and a callback for when it | ||
has finished. If the iterator passes an error to this callback, the main | ||
callback for the each function is immediately called with the error. | ||
Applies the function `iterator` to each item in `arr`, in parallel. | ||
The `iterator` is called with an item from the list, and a callback for when it | ||
has finished. If the `iterator` passes an error to its `callback`, the main | ||
`callback` (for the `each` function) is immediately called with the error. | ||
Note, that since this function applies the iterator to each item in parallel | ||
Note, that since this function applies `iterator` to each item in parallel, | ||
there is no guarantee that the iterator functions will complete in order. | ||
@@ -179,12 +185,13 @@ | ||
* arr - An array to iterate over. | ||
* iterator(item, callback) - A function to apply to each item in the array. | ||
The iterator is passed a callback(err) which must be called once it has | ||
completed. If no error has occured, the callback should be run without | ||
arguments or with an explicit null argument. | ||
* callback(err) - A callback which is called after all the iterator functions | ||
have finished, or an error has occurred. | ||
* `arr` - An array to iterate over. | ||
* `iterator(item, callback)` - A function to apply to each item in `arr`. | ||
The iterator is passed a `callback(err)` which must be called once it has | ||
completed. If no error has occured, the `callback` should be run without | ||
arguments or with an explicit `null` argument. | ||
* `callback(err)` - A callback which is called when all `iterator` functions | ||
have finished, or an error occurs. | ||
__Example__ | ||
__Examples__ | ||
```js | ||
@@ -199,2 +206,33 @@ // assuming openFiles is an array of file names and saveFile is a function | ||
```js | ||
// assuming openFiles is an array of file names and saveFile is a function | ||
// to save the modified contents of that file: | ||
async.each(openFiles, function( file, callback) { | ||
// Perform operation on file here. | ||
console.log('Processing file ' + file); | ||
callback(); | ||
if( file.length > 32 ) { | ||
console.log('This file name is too long'); | ||
callback('File name too long'); | ||
return; | ||
} else { | ||
console.log('File saved'); | ||
callback(); | ||
} | ||
}, function(err){ | ||
// if any of the saves produced an error, err would equal that error | ||
if( err ) { | ||
// One of the iterations produced an error. | ||
// All processing will now stop. | ||
console.log('A file failed to process'); | ||
} else { | ||
console.log('All files have been processed successfully'); | ||
} | ||
}); | ||
``` | ||
--------------------------------------- | ||
@@ -206,5 +244,5 @@ | ||
The same as each only the iterator is applied to each item in the array in | ||
series. The next iterator is only called once the current one has completed | ||
processing. This means the iterator functions will complete in order. | ||
The same as [`each`](#each), only `iterator` is applied to each item in `arr` in | ||
series. The next `iterator` is only called once the current one has completed. | ||
This means the `iterator` functions will complete in order. | ||
@@ -218,19 +256,18 @@ | ||
The same as each only no more than "limit" iterators will be simultaneously | ||
The same as [`each`](#each), only no more than `limit` `iterator`s will be simultaneously | ||
running at any time. | ||
Note that the items are not processed in batches, so there is no guarantee that | ||
the first "limit" iterator functions will complete before any others are | ||
started. | ||
Note that the items in `arr` are not processed in batches, so there is no guarantee that | ||
the first `limit` `iterator` functions will complete before any others are started. | ||
__Arguments__ | ||
* arr - An array to iterate over. | ||
* limit - The maximum number of iterators to run at any time. | ||
* iterator(item, callback) - A function to apply to each item in the array. | ||
The iterator is passed a callback(err) which must be called once it has | ||
* `arr` - An array to iterate over. | ||
* `limit` - The maximum number of `iterator`s to run at any time. | ||
* `iterator(item, callback)` - A function to apply to each item in `arr`. | ||
The iterator is passed a `callback(err)` which must be called once it has | ||
completed. If no error has occured, the callback should be run without | ||
arguments or with an explicit null argument. | ||
* callback(err) - A callback which is called after all the iterator functions | ||
have finished, or an error has occurred. | ||
arguments or with an explicit `null` argument. | ||
* `callback(err)` - A callback which is called when all `iterator` functions | ||
have finished, or an error occurs. | ||
@@ -253,22 +290,21 @@ __Example__ | ||
Produces a new array of values by mapping each value in the given array through | ||
the iterator function. The iterator is called with an item from the array and a | ||
callback for when it has finished processing. The callback takes 2 arguments, | ||
an error and the transformed item from the array. If the iterator passes an | ||
error to this callback, the main callback for the map function is immediately | ||
called with the error. | ||
Produces a new array of values by mapping each value in `arr` through | ||
the `iterator` function. The `iterator` is called with an item from `arr` and a | ||
callback for when it has finished processing. Each of these callback takes 2 arguments: | ||
an `error`, and the transformed item from `arr`. If `iterator` passes an error to this | ||
callback, the main `callback` (for the `map` function) is immediately called with the error. | ||
Note, that since this function applies the iterator to each item in parallel | ||
there is no guarantee that the iterator functions will complete in order, however | ||
the results array will be in the same order as the original array. | ||
Note, that since this function applies the `iterator` to each item in parallel, | ||
there is no guarantee that the `iterator` functions will complete in order. | ||
However, the results array will be in the same order as the original `arr`. | ||
__Arguments__ | ||
* arr - An array to iterate over. | ||
* iterator(item, callback) - A function to apply to each item in the array. | ||
The iterator is passed a callback(err, transformed) which must be called once | ||
it has completed with an error (which can be null) and a transformed item. | ||
* callback(err, results) - A callback which is called after all the iterator | ||
functions have finished, or an error has occurred. Results is an array of the | ||
transformed items from the original array. | ||
* `arr` - An array to iterate over. | ||
* `iterator(item, callback)` - A function to apply to each item in `arr`. | ||
The iterator is passed a `callback(err, transformed)` which must be called once | ||
it has completed with an error (which can be `null`) and a transformed item. | ||
* `callback(err, results)` - A callback which is called when all `iterator` | ||
functions have finished, or an error occurs. Results is an array of the | ||
transformed items from the `arr`. | ||
@@ -288,5 +324,5 @@ __Example__ | ||
The same as map only the iterator is applied to each item in the array in | ||
series. The next iterator is only called once the current one has completed | ||
processing. The results array will be in the same order as the original. | ||
The same as [`map`](#map), only the `iterator` is applied to each item in `arr` in | ||
series. The next `iterator` is only called once the current one has completed. | ||
The results array will be in the same order as the original. | ||
@@ -299,19 +335,18 @@ | ||
The same as map only no more than "limit" iterators will be simultaneously | ||
The same as [`map`](#map), only no more than `limit` `iterator`s will be simultaneously | ||
running at any time. | ||
Note that the items are not processed in batches, so there is no guarantee that | ||
the first "limit" iterator functions will complete before any others are | ||
started. | ||
Note that the items are not processed in batches, so there is no guarantee that | ||
the first `limit` `iterator` functions will complete before any others are started. | ||
__Arguments__ | ||
* arr - An array to iterate over. | ||
* limit - The maximum number of iterators to run at any time. | ||
* iterator(item, callback) - A function to apply to each item in the array. | ||
The iterator is passed a callback(err, transformed) which must be called once | ||
it has completed with an error (which can be null) and a transformed item. | ||
* callback(err, results) - A callback which is called after all the iterator | ||
functions have finished, or an error has occurred. Results is an array of the | ||
transformed items from the original array. | ||
* `arr` - An array to iterate over. | ||
* `limit` - The maximum number of `iterator`s to run at any time. | ||
* `iterator(item, callback)` - A function to apply to each item in `arr`. | ||
The iterator is passed a `callback(err, transformed)` which must be called once | ||
it has completed with an error (which can be `null`) and a transformed item. | ||
* `callback(err, results)` - A callback which is called when all `iterator` | ||
calls have finished, or an error occurs. The result is an array of the | ||
transformed items from the original `arr`. | ||
@@ -328,11 +363,12 @@ __Example__ | ||
<a name="select" /> | ||
<a name="filter" /> | ||
### filter(arr, iterator, callback) | ||
__Alias:__ select | ||
__Alias:__ `select` | ||
Returns a new array of all the values which pass an async truth test. | ||
_The callback for each iterator call only accepts a single argument of true or | ||
false, it does not accept an error argument first!_ This is in-line with the | ||
way node libraries work with truth tests like fs.exists. This operation is | ||
Returns a new array of all the values in `arr` which pass an async truth test. | ||
_The callback for each `iterator` call only accepts a single argument of `true` or | ||
`false`; it does not accept an error argument first!_ This is in-line with the | ||
way node libraries work with truth tests like `fs.exists`. This operation is | ||
performed in parallel, but the results array will be in the same order as the | ||
@@ -343,7 +379,7 @@ original. | ||
* arr - An array to iterate over. | ||
* iterator(item, callback) - A truth test to apply to each item in the array. | ||
The iterator is passed a callback(truthValue) which must be called with a | ||
* `arr` - An array to iterate over. | ||
* `iterator(item, callback)` - A truth test to apply to each item in `arr`. | ||
The `iterator` is passed a `callback(truthValue)`, which must be called with a | ||
boolean argument once it has completed. | ||
* callback(results) - A callback which is called after all the iterator | ||
* `callback(results)` - A callback which is called after all the `iterator` | ||
functions have finished. | ||
@@ -361,10 +397,11 @@ | ||
<a name="selectSeries" /> | ||
<a name="filterSeries" /> | ||
### filterSeries(arr, iterator, callback) | ||
__alias:__ selectSeries | ||
__Alias:__ `selectSeries` | ||
The same as filter only the iterator is applied to each item in the array in | ||
series. The next iterator is only called once the current one has completed | ||
processing. The results array will be in the same order as the original. | ||
The same as [`filter`](#filter) only the `iterator` is applied to each item in `arr` in | ||
series. The next `iterator` is only called once the current one has completed. | ||
The results array will be in the same order as the original. | ||
@@ -376,3 +413,3 @@ --------------------------------------- | ||
The opposite of filter. Removes values that pass an async truth test. | ||
The opposite of [`filter`](#filter). Removes values that pass an `async` truth test. | ||
@@ -384,3 +421,3 @@ --------------------------------------- | ||
The same as reject, only the iterator is applied to each item in the array | ||
The same as [`reject`](#reject), only the `iterator` is applied to each item in `arr` | ||
in series. | ||
@@ -394,23 +431,24 @@ | ||
__aliases:__ inject, foldl | ||
__Aliases:__ `inject`, `foldl` | ||
Reduces a list of values into a single value using an async iterator to return | ||
each successive step. Memo is the initial state of the reduction. This | ||
function only operates in series. For performance reasons, it may make sense to | ||
split a call to this function into a parallel map, then use the normal | ||
Array.prototype.reduce on the results. This function is for situations where | ||
each step in the reduction needs to be async, if you can get the data before | ||
reducing it then it's probably a good idea to do so. | ||
Reduces `arr` into a single value using an async `iterator` to return | ||
each successive step. `memo` is the initial state of the reduction. | ||
This function only operates in series. | ||
For performance reasons, it may make sense to split a call to this function into | ||
a parallel map, and then use the normal `Array.prototype.reduce` on the results. | ||
This function is for situations where each step in the reduction needs to be async; | ||
if you can get the data before reducing it, then it's probably a good idea to do so. | ||
__Arguments__ | ||
* arr - An array to iterate over. | ||
* memo - The initial state of the reduction. | ||
* iterator(memo, item, callback) - A function applied to each item in the | ||
array to produce the next step in the reduction. The iterator is passed a | ||
callback(err, reduction) which accepts an optional error as its first | ||
* `arr` - An array to iterate over. | ||
* `memo` - The initial state of the reduction. | ||
* `iterator(memo, item, callback)` - A function applied to each item in the | ||
array to produce the next step in the reduction. The `iterator` is passed a | ||
`callback(err, reduction)` which accepts an optional error as its first | ||
argument, and the state of the reduction as the second. If an error is | ||
passed to the callback, the reduction is stopped and the main callback is | ||
passed to the callback, the reduction is stopped and the main `callback` is | ||
immediately called with the error. | ||
* callback(err, result) - A callback which is called after all the iterator | ||
* `callback(err, result)` - A callback which is called after all the `iterator` | ||
functions have finished. Result is the reduced value. | ||
@@ -436,5 +474,5 @@ | ||
__Alias:__ foldr | ||
__Alias:__ `foldr` | ||
Same as reduce, only operates on the items in the array in reverse order. | ||
Same as [`reduce`](#reduce), only operates on `arr` in reverse order. | ||
@@ -447,19 +485,19 @@ | ||
Returns the first value in a list that passes an async truth test. The | ||
iterator is applied in parallel, meaning the first iterator to return true will | ||
fire the detect callback with that result. That means the result might not be | ||
the first item in the original array (in terms of order) that passes the test. | ||
Returns the first value in `arr` that passes an async truth test. The | ||
`iterator` is applied in parallel, meaning the first iterator to return `true` will | ||
fire the detect `callback` with that result. That means the result might not be | ||
the first item in the original `arr` (in terms of order) that passes the test. | ||
If order within the original array is important then look at detectSeries. | ||
If order within the original `arr` is important, then look at [`detectSeries`](#detectSeries). | ||
__Arguments__ | ||
* arr - An array to iterate over. | ||
* iterator(item, callback) - A truth test to apply to each item in the array. | ||
The iterator is passed a callback(truthValue) which must be called with a | ||
* `arr` - An array to iterate over. | ||
* `iterator(item, callback)` - A truth test to apply to each item in `arr`. | ||
The iterator is passed a `callback(truthValue)` which must be called with a | ||
boolean argument once it has completed. | ||
* callback(result) - A callback which is called as soon as any iterator returns | ||
true, or after all the iterator functions have finished. Result will be | ||
* `callback(result)` - A callback which is called as soon as any iterator returns | ||
`true`, or after all the `iterator` functions have finished. Result will be | ||
the first item in the array that passes the truth test (iterator) or the | ||
value undefined if none passed. | ||
value `undefined` if none passed. | ||
@@ -479,4 +517,4 @@ __Example__ | ||
The same as detect, only the iterator is applied to each item in the array | ||
in series. This means the result is always the first in the original array (in | ||
The same as [`detect`](#detect), only the `iterator` is applied to each item in `arr` | ||
in series. This means the result is always the first in the original `arr` (in | ||
terms of array order) that passes the truth test. | ||
@@ -490,14 +528,14 @@ | ||
Sorts a list by the results of running each value through an async iterator. | ||
Sorts a list by the results of running each `arr` value through an async `iterator`. | ||
__Arguments__ | ||
* arr - An array to iterate over. | ||
* iterator(item, callback) - A function to apply to each item in the array. | ||
The iterator is passed a callback(err, sortValue) which must be called once it | ||
has completed with an error (which can be null) and a value to use as the sort | ||
* `arr` - An array to iterate over. | ||
* `iterator(item, callback)` - A function to apply to each item in `arr`. | ||
The iterator is passed a `callback(err, sortValue)` which must be called once it | ||
has completed with an error (which can be `null`) and a value to use as the sort | ||
criteria. | ||
* callback(err, results) - A callback which is called after all the iterator | ||
functions have finished, or an error has occurred. Results is the items from | ||
the original array sorted by the values returned by the iterator calls. | ||
* `callback(err, results)` - A callback which is called after all the `iterator` | ||
functions have finished, or an error occurs. Results is the items from | ||
the original `arr` sorted by the values returned by the `iterator` calls. | ||
@@ -517,2 +555,21 @@ __Example__ | ||
__Sort Order__ | ||
By modifying the callback parameter the sorting order can be influenced: | ||
//ascending order | ||
async.sortBy([1,9,3,5], function(x, callback){ | ||
callback(err, x); | ||
}, function(err,result){ | ||
//result callback | ||
} ); | ||
//descending order | ||
async.sortBy([1,9,3,5], function(x, callback){ | ||
callback(err, x*-1); //<- x*-1 instead of x, turns the order around | ||
}, function(err,result){ | ||
//result callback | ||
} ); | ||
--------------------------------------- | ||
@@ -523,19 +580,19 @@ | ||
__Alias:__ any | ||
__Alias:__ `any` | ||
Returns true if at least one element in the array satisfies an async test. | ||
_The callback for each iterator call only accepts a single argument of true or | ||
false, it does not accept an error argument first!_ This is in-line with the | ||
way node libraries work with truth tests like fs.exists. Once any iterator | ||
call returns true, the main callback is immediately called. | ||
Returns `true` if at least one element in the `arr` satisfies an async test. | ||
_The callback for each iterator call only accepts a single argument of `true` or | ||
`false`; it does not accept an error argument first!_ This is in-line with the | ||
way node libraries work with truth tests like `fs.exists`. Once any iterator | ||
call returns `true`, the main `callback` is immediately called. | ||
__Arguments__ | ||
* arr - An array to iterate over. | ||
* iterator(item, callback) - A truth test to apply to each item in the array. | ||
The iterator is passed a callback(truthValue) which must be called with a | ||
boolean argument once it has completed. | ||
* callback(result) - A callback which is called as soon as any iterator returns | ||
true, or after all the iterator functions have finished. Result will be | ||
either true or false depending on the values of the async tests. | ||
* `arr` - An array to iterate over. | ||
* `iterator(item, callback)` - A truth test to apply to each item in the array | ||
in parallel. The iterator is passed a callback(truthValue) which must be | ||
called with a boolean argument once it has completed. | ||
* `callback(result)` - A callback which is called as soon as any iterator returns | ||
`true`, or after all the iterator functions have finished. Result will be | ||
either `true` or `false` depending on the values of the async tests. | ||
@@ -555,17 +612,17 @@ __Example__ | ||
__Alias:__ all | ||
__Alias:__ `all` | ||
Returns true if every element in the array satisfies an async test. | ||
_The callback for each iterator call only accepts a single argument of true or | ||
false, it does not accept an error argument first!_ This is in-line with the | ||
way node libraries work with truth tests like fs.exists. | ||
Returns `true` if every element in `arr` satisfies an async test. | ||
_The callback for each `iterator` call only accepts a single argument of `true` or | ||
`false`; it does not accept an error argument first!_ This is in-line with the | ||
way node libraries work with truth tests like `fs.exists`. | ||
__Arguments__ | ||
* arr - An array to iterate over. | ||
* iterator(item, callback) - A truth test to apply to each item in the array. | ||
The iterator is passed a callback(truthValue) which must be called with a | ||
boolean argument once it has completed. | ||
* callback(result) - A callback which is called after all the iterator | ||
functions have finished. Result will be either true or false depending on | ||
* `arr` - An array to iterate over. | ||
* `iterator(item, callback)` - A truth test to apply to each item in the array | ||
in parallel. The iterator is passed a callback(truthValue) which must be | ||
called with a boolean argument once it has completed. | ||
* `callback(result)` - A callback which is called after all the `iterator` | ||
functions have finished. Result will be either `true` or `false` depending on | ||
the values of the async tests. | ||
@@ -586,16 +643,16 @@ | ||
Applies an iterator to each item in a list, concatenating the results. Returns the | ||
concatenated list. The iterators are called in parallel, and the results are | ||
Applies `iterator` to each item in `arr`, concatenating the results. Returns the | ||
concatenated list. The `iterator`s are called in parallel, and the results are | ||
concatenated as they return. There is no guarantee that the results array will | ||
be returned in the original order of the arguments passed to the iterator function. | ||
be returned in the original order of `arr` passed to the `iterator` function. | ||
__Arguments__ | ||
* arr - An array to iterate over | ||
* iterator(item, callback) - A function to apply to each item in the array. | ||
The iterator is passed a callback(err, results) which must be called once it | ||
has completed with an error (which can be null) and an array of results. | ||
* callback(err, results) - A callback which is called after all the iterator | ||
functions have finished, or an error has occurred. Results is an array containing | ||
the concatenated results of the iterator function. | ||
* `arr` - An array to iterate over. | ||
* `iterator(item, callback)` - A function to apply to each item in `arr`. | ||
The iterator is passed a `callback(err, results)` which must be called once it | ||
has completed with an error (which can be `null`) and an array of results. | ||
* `callback(err, results)` - A callback which is called after all the `iterator` | ||
functions have finished, or an error occurs. Results is an array containing | ||
the concatenated results of the `iterator` function. | ||
@@ -615,3 +672,3 @@ __Example__ | ||
Same as async.concat, but executes in series instead of parallel. | ||
Same as [`concat`](#concat), but executes in series instead of parallel. | ||
@@ -624,22 +681,29 @@ | ||
Run an array of functions in series, each one running once the previous | ||
Run the functions in the `tasks` array 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 callback for the series is | ||
immediately called with the value of the error. Once the tasks have completed, | ||
the results are passed to the final callback as an array. | ||
callback, no more functions are run, and `callback` is immediately called with the value of the error. | ||
Otherwise, `callback` receives an array of results when `tasks` have completed. | ||
It is also possible to use an object instead of an array. Each property will be | ||
run as a function and the results will be passed to the final callback as an object | ||
run as a function, and the results will be passed to the final `callback` as an object | ||
instead of an array. This can be a more readable way of handling results from | ||
async.series. | ||
[`series`](#series). | ||
**Note** that while many implementations preserve the order of object properties, the | ||
[ECMAScript Language Specifcation](http://www.ecma-international.org/ecma-262/5.1/#sec-8.6) | ||
explicitly states that | ||
> The mechanics and order of enumerating the properties is not specified. | ||
So if you rely on the order in which your series of functions are executed, and want | ||
this to work on all platforms, consider using an array. | ||
__Arguments__ | ||
* tasks - An array or object containing functions to run, each function is passed | ||
a callback(err, result) it must call on completion with an error (which can | ||
be null) and an optional result value. | ||
* callback(err, results) - An optional callback to run once all the functions | ||
* `tasks` - An array or object containing functions to run, each function is passed | ||
a `callback(err, result)` it must call on completion with an error `err` (which can | ||
be `null`) and an optional `result` value. | ||
* `callback(err, results)` - An optional callback to run once all the functions | ||
have completed. This function gets a results array (or object) containing all | ||
the result arguments passed to the task callbacks. | ||
the result arguments passed to the `task` callbacks. | ||
@@ -688,12 +752,12 @@ __Example__ | ||
Run an array of functions in parallel, without waiting until the previous | ||
Run the `tasks` array of functions in parallel, without waiting until the previous | ||
function has completed. If any of the functions pass an error to its | ||
callback, the main callback is immediately called with the value of the error. | ||
Once the tasks have completed, the results are passed to the final callback as an | ||
callback, the main `callback` is immediately called with the value of the error. | ||
Once the `tasks` have completed, the results are passed to the final `callback` as an | ||
array. | ||
It is also possible to use an object instead of an array. Each property will be | ||
run as a function and the results will be passed to the final callback as an object | ||
run as a function and the results will be passed to the final `callback` as an object | ||
instead of an array. This can be a more readable way of handling results from | ||
async.parallel. | ||
[`parallel`](#parallel). | ||
@@ -703,6 +767,6 @@ | ||
* tasks - An array or object containing functions to run, each function is passed | ||
a callback(err, result) it must call on completion with an error (which can | ||
be null) and an optional result value. | ||
* callback(err, results) - An optional callback to run once all the functions | ||
* `tasks` - An array or object containing functions to run. Each function is passed | ||
a `callback(err, result)` which it must call on completion with an error `err` | ||
(which can be `null`) and an optional `result` value. | ||
* `callback(err, results)` - An optional callback to run once all the functions | ||
have completed. This function gets a results array (or object) containing all | ||
@@ -753,20 +817,20 @@ the result arguments passed to the task callbacks. | ||
<a name="parallel" /> | ||
<a name="parallelLimit" /> | ||
### parallelLimit(tasks, limit, [callback]) | ||
The same as parallel only the tasks are executed in parallel with a maximum of "limit" | ||
tasks executing at any time. | ||
The same as [`parallel`](#parallel), only `tasks` are executed in parallel | ||
with a maximum of `limit` tasks executing at any time. | ||
Note that the tasks are not executed in batches, so there is no guarantee that | ||
the first "limit" tasks will complete before any others are started. | ||
Note that the `tasks` are not executed in batches, so there is no guarantee that | ||
the first `limit` tasks will complete before any others are started. | ||
__Arguments__ | ||
* tasks - An array or object containing functions to run, each function is passed | ||
a callback(err, result) it must call on completion with an error (which can | ||
be null) and an optional result value. | ||
* limit - The maximum number of tasks to run at any time. | ||
* callback(err, results) - An optional callback to run once all the functions | ||
* `tasks` - An array or object containing functions to run, each function is passed | ||
a `callback(err, result)` it must call on completion with an error `err` (which can | ||
be `null`) and an optional `result` value. | ||
* `limit` - The maximum number of `tasks` to run at any time. | ||
* `callback(err, results)` - An optional callback to run once all the functions | ||
have completed. This function gets a results array (or object) containing all | ||
the result arguments passed to the task callbacks. | ||
the result arguments passed to the `task` callbacks. | ||
@@ -778,3 +842,3 @@ --------------------------------------- | ||
Repeatedly call fn, while test returns true. Calls the callback when stopped, | ||
Repeatedly call `fn`, while `test` returns `true`. Calls `callback` when stopped, | ||
or an error occurs. | ||
@@ -784,8 +848,8 @@ | ||
* test() - synchronous truth test to perform before each execution of fn. | ||
* fn(callback) - A function to call each time the test passes. The function is | ||
passed a callback(err) which must be called once it has completed with an | ||
optional error argument. | ||
* callback(err) - A callback which is called after the test fails and repeated | ||
execution of fn has stopped. | ||
* `test()` - synchronous truth test to perform before each execution of `fn`. | ||
* `fn(callback)` - A function which is called each time `test` passes. The function is | ||
passed a `callback(err)`, which must be called once it has completed with an | ||
optional `err` argument. | ||
* `callback(err)` - A callback which is called after the test fails and repeated | ||
execution of `fn` has stopped. | ||
@@ -814,4 +878,7 @@ __Example__ | ||
The post check version of whilst. To reflect the difference in the order of operations `test` and `fn` arguments are switched. `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript. | ||
The post-check version of [`whilst`](#whilst). To reflect the difference in | ||
the order of operations, the arguments `test` and `fn` are switched. | ||
`doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript. | ||
--------------------------------------- | ||
@@ -822,6 +889,6 @@ | ||
Repeatedly call fn, until test returns true. Calls the callback when stopped, | ||
Repeatedly call `fn` until `test` returns `true`. Calls `callback` when stopped, | ||
or an error occurs. | ||
The inverse of async.whilst. | ||
The inverse of [`whilst`](#whilst). | ||
@@ -833,3 +900,3 @@ --------------------------------------- | ||
Like doWhilst except the test is inverted. Note the argument ordering differs from `until`. | ||
Like [`doWhilst`](#doWhilst), except the `test` is inverted. Note the argument ordering differs from `until`. | ||
@@ -839,8 +906,23 @@ --------------------------------------- | ||
<a name="forever" /> | ||
### forever(fn, callback) | ||
### forever(fn, errback) | ||
Calls the asynchronous function 'fn' repeatedly, in series, indefinitely. | ||
If an error is passed to fn's callback then 'callback' is called with the | ||
error, otherwise it will never be called. | ||
Calls the asynchronous function `fn` with a callback parameter that allows it to | ||
call itself again, in series, indefinitely. | ||
If an error is passed to the callback then `errback` is called with the | ||
error, and execution stops, otherwise it will never be called. | ||
```js | ||
async.forever( | ||
function(next) { | ||
// next is suitable for passing to things that need a callback(err [, whatever]); | ||
// it will result in this function being called again. | ||
}, | ||
function(err) { | ||
// if next is called with a value in its first parameter, it will appear | ||
// in here as 'err', and execution will stop. | ||
} | ||
); | ||
``` | ||
--------------------------------------- | ||
@@ -851,5 +933,5 @@ | ||
Runs an array of functions in series, each passing their results to the next in | ||
the array. However, if any of the functions pass an error to the callback, the | ||
next function is not executed and the main callback is immediately called with | ||
Runs the `tasks` array of functions in series, each passing their results to the next in | ||
the array. However, if any of the `tasks` pass an error to their own callback, the | ||
next function is not executed, and the main `callback` is immediately called with | ||
the error. | ||
@@ -859,7 +941,7 @@ | ||
* tasks - An array of functions to run, each function is passed a | ||
callback(err, result1, result2, ...) it must call on completion. The first | ||
argument is an error (which can be null) and any further arguments will be | ||
* `tasks` - An array of functions to run, each function is passed a | ||
`callback(err, result1, result2, ...)` it must call on completion. The first | ||
argument is an error (which can be `null`) and any further arguments will be | ||
passed as arguments in order to the next task. | ||
* callback(err, [results]) - An optional callback to run once all the functions | ||
* `callback(err, [results])` - An optional callback to run once all the functions | ||
have completed. This will be passed the results of the last task's callback. | ||
@@ -877,2 +959,3 @@ | ||
function(arg1, arg2, callback){ | ||
// arg1 now equals 'one' and arg2 now equals 'two' | ||
callback(null, 'three'); | ||
@@ -895,4 +978,4 @@ }, | ||
functions. Each function consumes the return value of the function that | ||
follows. Composing functions f(), g() and h() would produce the result of | ||
f(g(h())), only this version uses callbacks to obtain the return values. | ||
follows. Composing functions `f()`, `g()`, and `h()` would produce the result of | ||
`f(g(h()))`, only this version uses callbacks to obtain the return values. | ||
@@ -903,3 +986,3 @@ Each function is executed with the `this` binding of the composed function. | ||
* functions... - the asynchronous functions to compose | ||
* `functions...` - the asynchronous functions to compose | ||
@@ -930,8 +1013,55 @@ | ||
--------------------------------------- | ||
<a name="seq" /> | ||
### seq(fn1, fn2...) | ||
Version of the compose function that is more natural to read. | ||
Each following function consumes the return value of the latter function. | ||
Each function is executed with the `this` binding of the composed function. | ||
__Arguments__ | ||
* functions... - the asynchronous functions to compose | ||
__Example__ | ||
```js | ||
// Requires lodash (or underscore), express3 and dresende's orm2. | ||
// Part of an app, that fetches cats of the logged user. | ||
// This example uses `seq` function to avoid overnesting and error | ||
// handling clutter. | ||
app.get('/cats', function(request, response) { | ||
function handleError(err, data, callback) { | ||
if (err) { | ||
console.error(err); | ||
response.json({ status: 'error', message: err.message }); | ||
} | ||
else { | ||
callback(data); | ||
} | ||
} | ||
var User = request.models.User; | ||
asyc.seq( | ||
_.bind(User.get, User), // 'User.get' has signature (id, callback(err, data)) | ||
handleError, | ||
function(user, fn) { | ||
user.getCats(fn); // 'getCats' has signature (callback(err, data)) | ||
}, | ||
handleError, | ||
function(cats) { | ||
response.json({ status: 'ok', message: 'Cats found', data: cats }); | ||
} | ||
)(req.session.user_id); | ||
} | ||
}); | ||
``` | ||
--------------------------------------- | ||
<a name="applyEach" /> | ||
### applyEach(fns, args..., callback) | ||
Applies the provided arguments to each function in the array, calling the | ||
callback after all functions have completed. If you only provide the first | ||
argument then it will return a function which lets you pass in the | ||
Applies the provided arguments to each function in the array, calling | ||
`callback` after all functions have completed. If you only provide the first | ||
argument, then it will return a function which lets you pass in the | ||
arguments as if it were a single function call. | ||
@@ -941,5 +1071,5 @@ | ||
* fns - the asynchronous functions to all call with the same arguments | ||
* args... - any number of separate arguments to pass to the function | ||
* callback - the final argument should be the callback, called when all | ||
* `fns` - the asynchronous functions to all call with the same arguments | ||
* `args...` - any number of separate arguments to pass to the function | ||
* `callback` - the final argument should be the callback, called when all | ||
functions have completed processing | ||
@@ -966,3 +1096,3 @@ | ||
The same as applyEach only the functions are applied in series. | ||
The same as [`applyEach`](#applyEach) only the functions are applied in series. | ||
@@ -974,13 +1104,13 @@ --------------------------------------- | ||
Creates a queue object with the specified concurrency. Tasks added to the | ||
queue will be processed in parallel (up to the concurrency limit). If all | ||
workers are in progress, the task is queued until one is available. Once | ||
a worker has completed a task, the task's callback is called. | ||
Creates a `queue` object with the specified `concurrency`. Tasks added to the | ||
`queue` are processed in parallel (up to the `concurrency` limit). If all | ||
`worker`s are in progress, the task is queued until one becomes available. | ||
Once a `worker` completes a `task`, that `task`'s callback is called. | ||
__Arguments__ | ||
* worker(task, callback) - An asynchronous function for processing a queued | ||
task, which must call its callback(err) argument when finished, with an | ||
optional error as an argument. | ||
* concurrency - An integer for determining how many worker functions should be | ||
* `worker(task, callback)` - An asynchronous function for processing a queued | ||
task, which must call its `callback(err)` argument when finished, with an | ||
optional `error` as an argument. | ||
* `concurrency` - An `integer` for determining how many `worker` functions should be | ||
run in parallel. | ||
@@ -990,16 +1120,17 @@ | ||
The queue object returned by this function has the following properties and | ||
The `queue` object returned by this function has the following properties and | ||
methods: | ||
* length() - a function returning the number of items waiting to be processed. | ||
* concurrency - an integer for determining how many worker functions should be | ||
run in parallel. This property can be changed after a queue is created to | ||
* `length()` - a function returning the number of items waiting to be processed. | ||
* `concurrency` - an integer for determining how many `worker` functions should be | ||
run in parallel. This property can be changed after a `queue` is created to | ||
alter the concurrency on-the-fly. | ||
* push(task, [callback]) - add a new task to the queue, the callback is called | ||
once the worker has finished processing the task. | ||
instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list. | ||
* unshift(task, [callback]) - add a new task to the front of the queue. | ||
* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued | ||
* empty - a callback that is called when the last item from the queue is given to a worker | ||
* drain - a callback that is called when the last item from the queue has returned from the worker | ||
* `push(task, [callback])` - add a new task to the `queue`. Calls `callback` once | ||
the `worker` has finished processing the task. Instead of a single task, a `tasks` array | ||
can be submitted. The respective callback is used for every task in the list. | ||
* `unshift(task, [callback])` - add a new task to the front of the `queue`. | ||
* `saturated` - a callback that is called when the `queue` length hits the `concurrency` limit, | ||
and further tasks will be queued. | ||
* `empty` - a callback that is called when the last item from the `queue` is given to a `worker`. | ||
* `drain` - a callback that is called when the last item from the `queue` has returned from the `worker`. | ||
@@ -1049,13 +1180,17 @@ __Example__ | ||
Creates a cargo object with the specified payload. Tasks added to the | ||
cargo will be processed altogether (up to the payload limit). If the | ||
worker is in progress, the task is queued until it is available. Once | ||
the worker has completed some tasks, each callback of those tasks is called. | ||
Creates a `cargo` object with the specified payload. Tasks added to the | ||
cargo will be processed altogether (up to the `payload` limit). If the | ||
`worker` is in progress, the task is queued until it becomes available. Once | ||
the `worker` has completed some tasks, each callback of those tasks is called. | ||
While [queue](#queue) passes only one task to one of a group of workers | ||
at a time, cargo passes an array of tasks to a single worker, repeating | ||
when the worker is finished. | ||
__Arguments__ | ||
* worker(tasks, callback) - An asynchronous function for processing an array of | ||
queued tasks, which must call its callback(err) argument when finished, with | ||
an optional error as an argument. | ||
* payload - An optional integer for determining how many tasks should be | ||
* `worker(tasks, callback)` - An asynchronous function for processing an array of | ||
queued tasks, which must call its `callback(err)` argument when finished, with | ||
an optional `err` argument. | ||
* `payload` - An optional `integer` for determining how many tasks should be | ||
processed per round; if omitted, the default is unlimited. | ||
@@ -1065,15 +1200,15 @@ | ||
The cargo object returned by this function has the following properties and | ||
The `cargo` object returned by this function has the following properties and | ||
methods: | ||
* length() - a function returning the number of items waiting to be processed. | ||
* payload - an integer for determining how many tasks should be | ||
process per round. This property can be changed after a cargo is created to | ||
* `length()` - A function returning the number of items waiting to be processed. | ||
* `payload` - An `integer` for determining how many tasks should be | ||
process per round. This property can be changed after a `cargo` is created to | ||
alter the payload on-the-fly. | ||
* push(task, [callback]) - add a new task to the queue, the callback is called | ||
once the worker has finished processing the task. | ||
instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list. | ||
* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued | ||
* empty - a callback that is called when the last item from the queue is given to a worker | ||
* drain - a callback that is called when the last item from the queue has returned from the worker | ||
* `push(task, [callback])` - Adds `task` to the `queue`. The callback is called | ||
once the `worker` has finished processing the task. Instead of a single task, an array of `tasks` | ||
can be submitted. The respective callback is used for every task in the list. | ||
* `saturated` - A callback that is called when the `queue.length()` hits the concurrency and further tasks will be queued. | ||
* `empty` - A callback that is called when the last item from the `queue` is given to a `worker`. | ||
* `drain` - A callback that is called when the last item from the `queue` has returned from the `worker`. | ||
@@ -1111,14 +1246,17 @@ __Example__ | ||
Determines the best order for running functions based on their requirements. | ||
Each function can optionally depend on other functions being completed first, | ||
and each function is run as soon as its requirements are satisfied. If any of | ||
the functions pass an error to their callback, that function will not complete | ||
(so any other functions depending on it will not run) and the main callback | ||
will be called immediately with the error. Functions also receive an object | ||
containing the results of functions which have completed so far. | ||
Determines the best order for running the functions in `tasks`, based on their | ||
requirements. Each function can optionally depend on other functions being completed | ||
first, and each function is run as soon as its requirements are satisfied. | ||
Note, all functions are called with a results object as a second argument, | ||
so it is unsafe to pass functions in the tasks object which cannot handle the | ||
extra argument. For example, this snippet of code: | ||
If any of the functions pass an error to their callback, it will not | ||
complete (so any other functions depending on it will not run), and the main | ||
`callback` is immediately called with the error. Functions also receive an | ||
object containing the results of functions which have completed so far. | ||
Note, all functions are called with a `results` object as a second argument, | ||
so it is unsafe to pass functions in the `tasks` object which cannot handle the | ||
extra argument. | ||
For example, this snippet of code: | ||
```js | ||
@@ -1130,3 +1268,3 @@ async.auto({ | ||
will have the effect of calling readFile with the results object as the last | ||
will have the effect of calling `readFile` with the results object as the last | ||
argument, which will fail: | ||
@@ -1138,4 +1276,4 @@ | ||
Instead, wrap the call to readFile in a function which does not forward the | ||
results object: | ||
Instead, wrap the call to `readFile` in a function which does not forward the | ||
`results` object: | ||
@@ -1152,16 +1290,16 @@ ```js | ||
* tasks - An object literal containing named functions or an array of | ||
requirements, with the function itself the last item in the array. The key | ||
* `tasks` - An object literal (containing named functions) or an array (of | ||
requirements, with the function itself the last item in the array). The key | ||
used for each function or array is used when specifying requirements. The | ||
function receives two arguments: (1) a callback(err, result) which must be | ||
called when finished, passing an error (which can be null) and the result of | ||
the function's execution, and (2) a results object, containing the results of | ||
function receives two arguments: (1) a `callback(err, result)` which must be | ||
called when finished, passing an `error` (which can be `null`) and the result of | ||
the function's execution, and (2) a `results` object, containing the results of | ||
the previously executed functions. | ||
* callback(err, results) - An optional callback which is called when all the | ||
tasks have been completed. The callback will receive an error as an argument | ||
if any tasks pass an error to their callback. Results will always be passed | ||
but if an error occurred, no other tasks will be performed, and the results | ||
object will only contain partial results. | ||
* `callback(err, results)` - An optional callback which is called when all the | ||
tasks have been completed. It receives the `err` argument if any `tasks` | ||
pass an error to their callback. Results are always returned; however, if | ||
an error occurs, no further `tasks` will be performed, and the results | ||
object will only contain partial results. | ||
__Example__ | ||
@@ -1172,17 +1310,27 @@ | ||
get_data: function(callback){ | ||
console.log('in get_data'); | ||
// async code to get some data | ||
callback(null, 'data', 'converted to array'); | ||
}, | ||
make_folder: function(callback){ | ||
console.log('in make_folder'); | ||
// async code to create a directory to store a file in | ||
// this is run at the same time as getting the data | ||
callback(null, 'folder'); | ||
}, | ||
write_file: ['get_data', 'make_folder', function(callback){ | ||
write_file: ['get_data', 'make_folder', function(callback, results){ | ||
console.log('in write_file', JSON.stringify(results)); | ||
// once there is some data and the directory exists, | ||
// write the data to a file in the directory | ||
callback(null, filename); | ||
callback(null, 'filename'); | ||
}], | ||
email_link: ['write_file', function(callback, results){ | ||
console.log('in email_link', JSON.stringify(results)); | ||
// once the file is written let's email a link to it... | ||
// results.write_file contains the filename returned by write_file. | ||
callback(null, {'file':results.write_file, 'email':'user@example.com'}); | ||
}] | ||
}, function(err, results) { | ||
console.log('err = ', err); | ||
console.log('results = ', results); | ||
}); | ||
@@ -1197,7 +1345,11 @@ ``` | ||
function(callback){ | ||
console.log('in get_data'); | ||
// async code to get some data | ||
callback(null, 'data', 'converted to array'); | ||
}, | ||
function(callback){ | ||
console.log('in make_folder'); | ||
// async code to create a directory to store a file in | ||
// this is run at the same time as getting the data | ||
callback(null, 'folder'); | ||
} | ||
@@ -1208,7 +1360,12 @@ ], | ||
function(callback){ | ||
console.log('in write_file', JSON.stringify(results)); | ||
// once there is some data and the directory exists, | ||
// write the data to a file in the directory | ||
results.push('filename'); | ||
callback(null); | ||
}, | ||
function(callback){ | ||
console.log('in email_link', JSON.stringify(results)); | ||
// once the file is written let's email a link to it... | ||
callback(null, {'file':results.pop(), 'email':'user@example.com'}); | ||
} | ||
@@ -1219,4 +1376,4 @@ ]); | ||
For a complicated series of async tasks using the auto function makes adding | ||
new tasks much easier and makes the code more readable. | ||
For a complicated series of `async` tasks, using the [`auto`](#auto) function makes adding | ||
new tasks much easier (and the code more readable). | ||
@@ -1229,7 +1386,7 @@ | ||
Creates an iterator function which calls the next function in the array, | ||
Creates an iterator function which calls the next function in the `tasks` array, | ||
returning a continuation to call the next one after that. It's also possible to | ||
'peek' the next iterator by doing iterator.next(). | ||
“peek” at the next iterator with `iterator.next()`. | ||
This function is used internally by the async module but can be useful when | ||
This function is used internally by the `async` module, but can be useful when | ||
you want to manually control the flow of functions in series. | ||
@@ -1239,3 +1396,3 @@ | ||
* tasks - An array of functions to run. | ||
* `tasks` - An array of functions to run. | ||
@@ -1267,4 +1424,5 @@ __Example__ | ||
Creates a continuation function with some arguments already applied, a useful | ||
shorthand when combined with other control flow functions. Any arguments | ||
Creates a continuation function with some arguments already applied. | ||
Useful as a shorthand when combined with other control flow functions. Any arguments | ||
passed to the returned function are added to the arguments originally passed | ||
@@ -1275,4 +1433,4 @@ to apply. | ||
* function - The function you want to eventually apply all arguments to. | ||
* arguments... - Any number of arguments to automatically apply when the | ||
* `function` - The function you want to eventually apply all arguments to. | ||
* `arguments...` - Any number of arguments to automatically apply when the | ||
continuation is called. | ||
@@ -1319,6 +1477,6 @@ | ||
Calls the callback on a later loop around the event loop. In node.js this just | ||
calls process.nextTick, in the browser it falls back to setImmediate(callback) | ||
if available, otherwise setTimeout(callback, 0), which means other higher priority | ||
events may precede the execution of the callback. | ||
Calls `callback` on a later loop around the event loop. In Node.js this just | ||
calls `process.nextTick`; in the browser it falls back to `setImmediate(callback)` | ||
if available, otherwise `setTimeout(callback, 0)`, which means other higher priority | ||
events may precede the execution of `callback`. | ||
@@ -1329,3 +1487,3 @@ This is used internally for browser-compatibility purposes. | ||
* callback - The function to call on a later loop around the event loop. | ||
* `callback` - The function to call on a later loop around the event loop. | ||
@@ -1346,9 +1504,9 @@ __Example__ | ||
Calls the callback n times and accumulates results in the same manner | ||
you would use with async.map. | ||
Calls the `callback` function `n` times, and accumulates results in the same manner | ||
you would use with [`map`](#map). | ||
__Arguments__ | ||
* n - The number of times to run the function. | ||
* callback - The function to call n times. | ||
* `n` - The number of times to run the function. | ||
* `callback` - The function to call `n` times. | ||
@@ -1377,5 +1535,5 @@ __Example__ | ||
The same as times only the iterator is applied to each item in the array in | ||
series. The next iterator is only called once the current one has completed | ||
processing. The results array will be in the same order as the original. | ||
The same as [`times`](#times), only the iterator is applied to each item in `arr` in | ||
series. The next `iterator` is only called once the current one has completed. | ||
The results array will be in the same order as the original. | ||
@@ -1388,3 +1546,3 @@ | ||
Caches the results of an async function. When creating a hash to store function | ||
Caches the results of an `async` function. When creating a hash to store function | ||
results against, the callback is omitted from the hash and an optional hash | ||
@@ -1398,5 +1556,5 @@ function can be used. | ||
* fn - the function you to proxy and cache results from. | ||
* hasher - an optional function for generating a custom hash for storing | ||
results, it has all the arguments applied to it apart from the callback, and | ||
* `fn` - The function to proxy and cache results from. | ||
* `hasher` - Tn optional function for generating a custom hash for storing | ||
results. It has all the arguments applied to it apart from the callback, and | ||
must be synchronous. | ||
@@ -1422,8 +1580,8 @@ | ||
Undoes a memoized function, reverting it to the original, unmemoized | ||
form. Comes handy in tests. | ||
Undoes a [`memoize`](#memoize)d function, reverting it to the original, unmemoized | ||
form. Handy for testing. | ||
__Arguments__ | ||
* fn - the memoized function | ||
* `fn` - the memoized function | ||
@@ -1433,5 +1591,5 @@ <a name="log" /> | ||
Logs the result of an async function to the console. Only works in node.js or | ||
in browsers that support console.log and console.error (such as FF and Chrome). | ||
If multiple arguments are returned from the async function, console.log is | ||
Logs the result of an `async` function to the `console`. Only works in Node.js or | ||
in browsers that support `console.log` and `console.error` (such as FF and Chrome). | ||
If multiple arguments are returned from the async function, `console.log` is | ||
called on each argument in order. | ||
@@ -1441,4 +1599,4 @@ | ||
* function - The function you want to eventually apply all arguments to. | ||
* arguments... - Any number of arguments to apply to the function. | ||
* `function` - The function you want to eventually apply all arguments to. | ||
* `arguments...` - Any number of arguments to apply to the function. | ||
@@ -1464,6 +1622,6 @@ __Example__ | ||
Logs the result of an async function to the console using console.dir to | ||
display the properties of the resulting object. Only works in node.js or | ||
in browsers that support console.dir and console.error (such as FF and Chrome). | ||
If multiple arguments are returned from the async function, console.dir is | ||
Logs the result of an `async` function to the `console` using `console.dir` to | ||
display the properties of the resulting object. Only works in Node.js or | ||
in browsers that support `console.dir` and `console.error` (such as FF and Chrome). | ||
If multiple arguments are returned from the async function, `console.dir` is | ||
called on each argument in order. | ||
@@ -1473,4 +1631,4 @@ | ||
* function - The function you want to eventually apply all arguments to. | ||
* arguments... - Any number of arguments to apply to the function. | ||
* `function` - The function you want to eventually apply all arguments to. | ||
* `arguments...` - Any number of arguments to apply to the function. | ||
@@ -1496,3 +1654,3 @@ __Example__ | ||
Changes the value of async back to its original value, returning a reference to the | ||
async object. | ||
Changes the value of `async` back to its original value, returning a reference to the | ||
`async` object. |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
81257
6
924
1584