forEachAsync === Analogous to `[].forEach`, but handles items asynchronously with a final callback passed to `then`. This is the most essential piece of the [`ArrayAsync`](https://github.com/FuturesJS/ArrayAsync) package. For cases where you want to loop through batches of items at once (as opposed to strictly one-by-one as forEachAsync does), check out [`forAllAsync`](https://github.com/FuturesJS/forAllAsync) and [`lateral`](https://github.com/FuturesJS/lateral). For cases where you want to loop through all items at once and we able to know when they're all done see [`join`](https://github.com/FuturesJS/join) v3.x - Diet Cola Edition --- As I do every few years, I decided to rewrite FuturesJS. This year's remake is extremely lightweight. Usage === It's as simple as you could guess: ```javascript // waits for one request to finish before beginning the next forEachAsync(['dogs', 'cats', 'octocats'], function (next, element, index, array) { getPics(element, next); // then after all of the elements have been handled // the final callback fires to let you know it's all done }).then(function () { console.log('All requests have finished'); }); // where `getPics` might be an asynchronous web request such as this function getPics(animal, cb) { var flickerAPI = "http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?"; $.getJSON( flickerAPI , { tags: thing , tagmode: "any" , format: "json" , success: function (data) { console.log('teh animals:', data); } , complete: cb } ); } ``` Browser Installation === You can install from bower: ```bash bower install forEachAsync ``` Or download the raw file from : ```bash wget https://raw.github.com/FuturesJS/forEachAsync/master/forEachAsync.js ``` ```javascript (function () { 'use strict'; var forEachAsync = window.forEachAsync ; // do stuff ... }()); ``` Or you can build it alongside other libraries: ```bash npm install -g pakmanager npm install forEachAsync --save pakmanager -e browser build ``` ```html ``` ```javascript (function () { 'use strict'; var forEachAsync = require('forEachAsync').forEachAsync ; // do stuff ... }()); ``` Node Installation === ```bash npm install --save forEachAsync@3.x ``` API === **`forEachAsync(array, callback[, thisArg])`** Parameters * `array` Array of elements to iterate over * `callback` Function to execute for each element, takes 4 arguments * `next` the function to call when the current element has been dealt with * `element` a single element of the aforementioned array * `index` the index of the current element * `array` the same array mentioned above * `thisArg` Object to use as `this` when executing `callback` **`forEachAsync#then(done)`** Parameters * `then` is in the return value of `forEachAsync` and accepts a final `done` callback. * `done` called after `forEachAsync` is complete, takes no arguments Internal API === `forEachAsync.__BREAK` This is used internally for the purposes of the `ArrayAsync` library. Please don't `break` stuff; use [`ArrayAsync`](https://github.com/FuturesJS/ArrayAsync)`.someAsync` or [`ArrayAsync`](https://github.com/FuturesJS/ArrayAsync)`.everyAsync` instead.