33 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	v3.2.5
- Ensure 
Errorobjects such asAggregateErrorare propagated without modification (#1920) 
v3.2.4
- Fix a bug in 
priorityQueuewhere it didn't wait for the result. (#1725) - Fix a bug where 
unshiftAsyncwas included inpriorityQueue. (#1790) 
v3.2.3
- Fix bugs in comment parsing in 
autoInject. (#1767, #1780) 
v3.2.2
- Fix potential prototype pollution exploit
 
v3.2.1
- Use 
queueMicrotaskif available to the environment (#1761) - Minor perf improvement in 
priorityQueue(#1727) - More examples in documentation (#1726)
 - Various doc fixes (#1708, #1712, #1717, #1740, #1739, #1749, #1756)
 - Improved test coverage (#1754)
 
v3.2.0
- Fix a bug in Safari related to overwriting 
func.name - Remove built-in browserify configuration (#1653)
 - Varios doc fixes (#1688, #1703, #1704)
 
v3.1.1
- Allow redefining 
nameproperty on wrapped functions. 
v3.1.0
- Added 
q.pushAsyncandq.unshiftAsync, analagous toq.pushandq.unshift, except they always do not accept a callback, and reject if processing the task errors. (#1659) - Promises returned from 
q.pushandq.unshiftwhen a callback is not passed now resolve even if an error ocurred. (#1659) - Fixed a parsing bug in 
autoInjectwith complicated function bodies (#1663) - Added ES6+ configuration for Browserify bundlers (#1653)
 - Various doc fixes (#1664, #1658, #1665, #1652)
 
v3.0.1
Bug fixes
- Fixed a regression where arrays passed to 
queueandcargowould be completely flattened. (#1645) - Clarified Async's browser support (#1643)
 
v3.0.0
The async/await release!
There are a lot of new features and subtle breaking changes in this major version, but the biggest feature is that most Async methods return a Promise if you omit the callback, meaning you can await them from within an async function.
const results = await async.mapLimit(urls, 5, async url => {
    const resp = await fetch(url)
    return resp.body
})
Breaking Changes
- Most Async methods return a Promise when the final callback is omitted, making them 
await-able! (#1572) - We are now making heavy use of ES2015 features, this means we have dropped out-of-the-box support for Node 4 and earlier, and many old versions of browsers. (#1541, #1553)
 - In 
queue,priorityQueue,cargoandcargoQueue, the "event"-style methods, likeq.drainandq.saturatedare now methods that register a callback, rather than properties you assign a callback to. They are now of the formq.drain(callback). If you do not pass a callback a Promise will be returned for the next occurrence of the event, making themawait-able, e.g.await q.drain(). (#1586, #1641) - Calling 
callback(false)will cancel an async method, preventing further iteration and callback calls. This is useful for preventing memory leaks when you break out of an async flow by calling an outer callback. (#1064, #1542) duringanddoDuringhave been removed, and insteadwhilst,doWhilst,untilanddoUntilnow have asynchronoustestfunctions. (#850, #1557)limitsof less than 1 now cause an error to be thrown in queues and collection methods. (#1249, #1552)memoizeno longer memoizes errors (#1465, #1466)applyEach/applyEachSerieshave a simpler interface, to make them more easily type-able. It always returns a function that takes in a single callback argument. If that callback is omitted, a promise is returned, making it awaitable. (#1228, #1640)
New Features
- Async generators are now supported in all the Collection methods. (#1560)
 - Added 
cargoQueue, a queue with bothconcurrencyandpayloadsize parameters. (#1567) - Queue objects returned from 
queuenow have aSymbol.iteratormethod, meaning they can be iterated over to inspect the current list of items in the queue. (#1459, #1556) - A ESM-flavored 
async.mjsis included in theasyncpackage. This is described in thepackage.json"module"field, meaning it should be automatically used by Webpack and other compatible bundlers. 
Bug fixes
- Better handle arbitrary error objects in 
asyncify(#1568, #1569) 
Other
- Removed Lodash as a dependency (#1283, #1528)
 - Miscellaneous docs fixes (#1393, #1501, #1540, #1543, #1558, #1563, #1564, #1579, #1581)
 - Miscellaneous test fixes (#1538)
 
v2.6.1
- Updated lodash to prevent 
npm auditwarnings. (#1532, #1533) - Made 
async-esmore optimized for webpack users (#1517) - Fixed a stack overflow with large collections and a synchronous iterator (#1514)
 - Various small fixes/chores (#1505, #1511, #1527, #1530)
 
v2.6.0
- Added missing aliases for many methods.  Previously, you could not (e.g.) 
require('async/find')or useasync.anyLimit. (#1483) - Improved 
queueperformance. (#1448, #1454) - Add missing sourcemap (#1452, #1453)
 - Various doc updates (#1448, #1471, #1483)
 
v2.5.0
- Added 
concatLimit, theLimitequivalent ofconcat(#1426, #1430) concatimprovements: it now preserves order, handles falsy values and theiterateecallback takes a variable number of arguments (#1437, #1436)- Fixed an issue in 
queuewhere there was a size discrepancy betweenworkersList().lengthandrunning()(#1428, #1429) - Various doc fixes (#1422, #1424)
 
v2.4.1
v2.4.0
- Added 
tryEach, for running async functions in parallel, where you only expect one to succeed. (#1365, #687) - Improved performance, most notably in 
parallelandwaterfall(#1395) - Added 
queue.remove(), for removing items in aqueue(#1397, #1391) - Fixed using 
eval, preventing Async from running in pages with Content Security Policy (#1404, #1403) - Fixed errors thrown in an 
asyncifyed function's callback being caught by the underlying Promise (#1408) - Fixed timing of 
queue.empty()(#1367) - Various doc fixes (#1314, #1394, #1412)
 
v2.3.0
- Added support for ES2017 
asyncfunctions. Wherever you can pass a Node-style/CPS function that uses a callback, you can also pass anasyncfunction. Previously, you had to wrapasyncfunctions withasyncify. The caveat is that it will only work ifasyncfunctions are supported natively in your environment, transpiled implementations can't be detected. (#1386, #1390) - Small doc fix (#1392)
 
v2.2.0
- Added 
groupBy, and theSeries/Limitequivalents, analogous to_.groupBy(#1364) - Fixed 
transformbug whencallbackwas not passed (#1381) - Added note about 
reflecttoparalleldocs (#1385) 
v2.1.5
- Fix 
autobug when function names collided with Array.prototype (#1358) - Improve some error messages (#1349)
 - Avoid stack overflow case in queue
 - Fixed an issue in 
some,everyandfindwhere processing would continue after the result was determined. - Cleanup implementations of 
some,everyandfind 
v2.1.3
- Make bundle size smaller
 - Create optimized hotpath for 
filterin array case. 
v2.1.2
- Fixed a stackoverflow bug with 
detect,some,everyon large inputs (#1293). 
v2.1.0
retryandretryablenow support an optionalerrorFilterfunction that determines if thetaskshould retry on the error (#1256, #1261)- Optimized array iteration in 
race,cargo,queue, andpriorityQueue(#1253) - Added alias documentation to doc site (#1251, #1254)
 - Added BootStrap scrollspy to docs to highlight in the sidebar the current method being viewed (#1289, #1300)
 - Various minor doc fixes (#1263, #1264, #1271, #1278, #1280, #1282, #1302)
 
v2.0.1
- Significantly optimized all iteration based collection methods such as 
each,map,filter, etc (#1245, #1246, #1247). 
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:
- Takes a variable number of arguments
 - The last argument is always a callback
 - The callback can accept any number of arguments
 - The first argument passed to the callback will be treated as an error result, if the argument is truthy
 - Any number of result arguments can be passed after the "error" argument
 - 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-espackage. (import {forEachSeries} from 'async-es') (#984, #996) - Added 
race, analogous toPromise.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 
reflectandreflectAll, analagous toPromise.reflect(), a wrapper for async tasks that always succeeds, by gathering results and errors into an object. (#942, #1012, #1095) constantsupports dynamic arguments -- it will now always use its last argument as the callback. (#1016, #1052)setImmediateandnextTicknow support arguments to partially apply to the deferred function, like the node-native versions do. (#940, #1053)autonow supports resolving cyclic dependencies using Kahn's algorithm (#1140).- Added 
autoInject, a relative ofautothat automatically spreads a task's dependencies as arguments to the task function. (#608, #1055, #1099, #1100) - You can now limit the concurrency of 
autotasks. (#635, #637) - Added 
retryable, a relative ofretrythat wraps an async function, making it retry when called. (#1058) retrynow supports specifying a function that determines the next time interval, useful for exponential backoff, logging and other retry strategies. (#1161)retrywill now pass all of the arguments the task function was resolved with to the callback (#1231).- Added 
q.unsaturated-- callback called when aqueue's number of running workers falls below a threshold. (#868, #1030, #1033, #1034) - Added 
q.error-- a callback called whenever aqueuetask calls its callback with an error. (#1170) applyEachandapplyEachSeriesnow 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) autotask functions now always take the callback as the last argument. If a task has dependencies, theresultsobject will be passed as the first argument. To migrate old task functions, wrap them with_.flip(#1036, #1042)- Internal 
setImmediatecalls have been refactored away. This may make existing flows vulnerable to stack overflows if you use many synchronous functions in series. UseensureAsyncto work around this. (#696, #704, #1049, #1050) mapused to return an object when iterating over an object.mapnow always returns an array, like in other libraries. The previous object behavior has been split out intomapValues. (#1157, #1177)filter,reject,some,every,detectand their families like{METHOD}Seriesand{METHOD}Limitnow expect an error as the first callback argument, rather than just a simple boolean. Passnullas the first argument, or usefs.accessinstead offs.exists. (#118, #774, #1028, #1041){METHOD}and{METHOD}Seriesare 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 toseriesorauto. The partially applied "control-flow" behavior has been separated out intoretryable. (#1054, #1058)- The test function for 
whilst,until, andduringused 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 thedoWhilst,doUntil, anddoDuringfunctions pass iteratee callback arguments to the test function (#1217, #1224) - The 
q.tasksarray has been renamedq._tasksand 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 aqueuehas been modified to better reflect when tasks pushed to the queue will start queueing. (#724, #1078) - Removed 
iteratormethod 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 
asyncifywithPromisescould resolve twice (#1197). - Fixed several documented optional callbacks not actually being optional (#1223).
 
Other
- Added 
someSeriesandeverySeriesfor symmetry, as well as a complete set ofany/anyLimit/anySeriesandall//allLmit/allSeriesaliases. - Added 
findas an alias fordetect. (as well asfindLimitandfindSeries`). - Various doc fixes (#1005, #1008, #1010, #1015, #1021, #1037, #1039, #1051, #1102, #1107, #1121, #1123, #1129, #1135, #1138, #1141, #1153, #1216, #1217, #1232, #1233, #1236, #1238)
 
Thank you @aearly and @megawac for taking the lead on version 2 of async.
v1.5.2
- Allow using 
"constructor"as an argument inmemoize(#998) - Give a better error messsage when 
autodependency checking fails (#994) - Various doc updates (#936, #956, #979, #1002)
 
v1.5.1
- Fix issue with 
pauseinqueuewith concurrency enabled (#946) whileanduntilnow pass the final result to callback (#963)autowill properly handle concurrency when there is no callback (#966)autowill no. properly stop execution when an error occurs (#988, #993)- Various doc fixes (#971, #980)
 
v1.5.0
- Added 
transform, analogous to_.transform(#892) mapnow returns an object when an object is passed in, rather than array with non-numeric keys.mapwill begin always returning an array with numeric indexes in the next major release. (#873)autonow accepts an optionalconcurrencyargument to limit the number o. running tasks (#637)- Added 
queue#workersList(), to retrieve the lis. of currently running tasks. (#891) - Various code simplifications (#896, #904)
 - Various doc fixes 📜 (#890, #894, #903, #905, #912)
 
v1.4.2
- Ensure coverage files don't get published on npm (#879)
 
v1.4.1
- Add in overlooked 
detectLimitmethod (#866) - Removed unnecessary files from npm releases (#861)
 - Removed usage of a reserved word to prevent 💥 in older environments (#870)
 
v1.4.0
asyncifynow supports promises (#840)- Added 
Limitversions offilterandreject(#836) - Add 
Limitversions ofdetect,someandevery(#828, #829) some,everyanddetectnow short circuit early (#828, #829)- Improve detection of the global object (#804), enabling use in WebWorkers
 whilstnow called with arguments from iterator (#823)duringnow gets called with arguments from iterator (#824)- Code simplifications and optimizations aplenty (diff)
 
v1.3.0
New Features:
- Added 
constant - Added 
asyncify/wrapSyncfor making sync functions work with callbacks. (#671, #806) - Added 
duringanddoDuring, which are likewhilstwith an async truth test. (#800) retrynow accepts anintervalparameter to specify a delay between retries. (#793)asyncshould work better in Web Workers due to betterrootdetection (#804)- Callbacks are now optional in 
whilst,doWhilst,until, anddoUntil(#642) - Various internal updates (#786, #801, #802, #803)
 - Various doc fixes (#790, #794)
 
Bug Fixes:
cargonow exposes thepayloadsize, andcargo.payloadcan be changed on the fly after thecargois created. (#740, #744, #783)
v1.2.1
Bug Fix:
- Small regression with synchronous iterator behavior in 
eachSerieswith a 1-element array. Before 1.1.0,eachSeries's callback was called on the same tick, which this patch restores. In 2.0.0, it will be called on the next tick. (#782) 
v1.2.0
New Features:
- Added 
timesLimit(#743) concurrencycan be changed after initialization inqueueby settingq.concurrency. The new concurrency will be reflected the next time a task is processed. (#747, #772)
Bug Fixes:
- Fixed a regression in 
eachand family with empty arrays that have additional properties. (#775, #777) 
v1.1.1
Bug Fix:
- Small regression with synchronous iterator behavior in 
eachSerieswith a 1-element array. Before 1.1.0,eachSeries's callback was called on the same tick, which this patch restores. In 2.0.0, it will be called on the next tick. (#782) 
v1.1.0
New Features:
cargonow supports all of the same methods and event callbacks asqueue.- Added 
ensureAsync- A wrapper that ensures an async function calls its callback on a later tick. (#769) - Optimized 
map,eachOf, andwaterfallfamilies of functions - Passing a 
nullorundefinedarray tomap,each,paralleland families will be treated as an empty array (#667). - The callback is now optional for the composed results of 
composeandseq. (#618) - Reduced file size by 4kb, (minified version by 1kb)
 - Added code coverage through 
nycandcoveralls(#768) 
Bug Fixes:
foreverwill no longer stack overflow with a synchronous iterator (#622)eachLimitand other limit functions will stop iterating once an error occurs (#754)- Always pass 
nullin callbacks when there is no error (#439) - Ensure proper conditions when calling 
drain()after pushing an empty data set to a queue (#668) eachand family will properly handle an empty array (#578)eachSeriesand family will finish if the underlying array is modified during execution (#557)queuewill throw if a non-function is passed toq.push()(#593)- Doc fixes (#629, #766)
 
v1.0.0
No known breaking changes, we are simply complying with semver from here on out.
Changes:
- Start using a changelog!
 - Add 
forEachOffor iterating over Objects (or to iterate Arrays with indexes available) (#168 #704 #321) - Detect deadlocks in 
auto(#663) - Better support for require.js (#527)
 - Throw if queue created with concurrency 
0(#714) - Fix unneeded iteration in 
queue.resume()(#758) - Guard against timer mocking overriding 
setImmediate(#609 #611) - Miscellaneous doc fixes (#542 #596 #615 #628 #631 #690 #729)
 - Use single noop function internally (#546)
 - Optimize internal 
_each,_mapand_keysfunctions.