initial commit
This commit is contained in:
commit
4890f3ac92
|
@ -0,0 +1,124 @@
|
||||||
|
forEachAsync
|
||||||
|
===
|
||||||
|
|
||||||
|
v3.0 - Diet Cola Edition (not yet published to npm)
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
Usage
|
||||||
|
===
|
||||||
|
|
||||||
|
It's as simple as you could guess:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// an asynchronous web request
|
||||||
|
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
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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');
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Browser Installation
|
||||||
|
===
|
||||||
|
|
||||||
|
You can download and include `forEachAsync.js`:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<script src="https://raw.github.com/FuturesJS/forEachAsync/master/forEachAsync.js"></script>
|
||||||
|
```
|
||||||
|
|
||||||
|
```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@3.x --save
|
||||||
|
pakmanager -e browser build
|
||||||
|
```
|
||||||
|
|
||||||
|
```html
|
||||||
|
<script src="pakmanaged.js"></script>
|
||||||
|
```
|
||||||
|
|
||||||
|
```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 `someAsync` or `everyAsync` instead.
|
|
@ -0,0 +1,34 @@
|
||||||
|
/*jshint -W054 */
|
||||||
|
(function (exports) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
function forEachAsync(arr, fn, thisArg) {
|
||||||
|
var dones = []
|
||||||
|
, index = -1
|
||||||
|
;
|
||||||
|
|
||||||
|
function next(BREAK, newArr) {
|
||||||
|
if (0 === arr.length || BREAK === forEachAsync.__BREAK) {
|
||||||
|
dones.forEach(function (done) {
|
||||||
|
done.call(thisArg, newArr);
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
index += 1;
|
||||||
|
fn.call(thisArg, next, arr.shift(), index, arr);
|
||||||
|
}
|
||||||
|
|
||||||
|
setTimeout(next, 4);
|
||||||
|
|
||||||
|
return {
|
||||||
|
then: function (_done) {
|
||||||
|
dones.push(_done);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
forEachAsync.__BREAK = {};
|
||||||
|
|
||||||
|
exports.forEachAsync = forEachAsync;
|
||||||
|
}('undefined' !== typeof exports && exports || new Function('return this')()));
|
Loading…
Reference in New Issue