v3.x - Diet Cola Edition
ArrayAsync provides asynchronous counterparts for each of the Array iterate methods
forEachAsynceveryAsyncsomeAsyncfilterAsyncmapAsyncreduceAsyncreduceRightAsync* (uses reversed copy of original array)
Each of the other array methods is a thin (12-line long) wrapper around the
diet (27-line long) forEachAsync,
which is the core workhorse.
Where size is a concern and you don't need all 86 lines of code, I would invite you to simply look at the source and copy/paste what you need (and attribute, of course).
Browser Installation
<script src="https://raw.github.com/FuturesJS/forEachAsync/master/forEachAsync.js"></script> <script src="https://raw.github.com/FuturesJS/ArrayAsync/master/array-async.js"></script>
(function () { 'use strict'; var filterAsync = window.filterAsync ; filterAsync(['dogs', 'cats', 'octocats'], function (next, element) { askTheUserIfTheyLikeThis(element, function (likesIt) { next(likesIt); }); }).then(function (newArr) { showTheUserThingsTheyLike(newArr); }); }());
Node Installation
(function () { 'use strict'; var ArrayAsync = require('async-array').filterAsync ; filterAsync(['dogs', 'cats', 'octocats'], function (next, element) { askTheUserIfTheyLikeThis(element, function (likesIt) { next(likesIt); }); }).then(function (newArr) { showTheUserThingsTheyLike(newArr); }); }());
Different Names for the Same Thing
I'm not sure which is the clear win yet:
Call each *Async function as needed
var mapAsync = require('array-async').mapAsync ;
Use them attached to ArrayAsync object
var ArrayAsync = require('array-async').ArrayAsync ; // Access each without the trailing 'Async' ArrayAsync.reduce(arr, fn);
Attach the async methods to Array
require('array-async').infect(Array); Array.filterAsync(array, fn);
I've been the prototype route before... it was a bad idea.