JavaScript Sync/Async forEach
An optionally-asynchronous forEach with an interesting interface.
Getting Started
This code should work just fine in Node.js:
First, install the module with: npm install async-foreach
var forEach = require('async-foreach').forEach;
forEach(["a", "b", "c"], function(item, index, arr) {
console.log("each", item, index, arr);
});
Or in the browser:
<script src="dist/ba-foreach.min.js"></script>
<script>
forEach(["a", "b", "c"], function(item, index, arr) {
console.log("each", item, index, arr);
});
</script>
In the browser, you can attach the forEach method to any object.
<script>
this.exports = Bocoup.utils;
</script>
<script src="dist/ba-foreach.min.js"></script>
<script>
Bocoup.utils.forEach(["a", "b", "c"], function(item, index, arr) {
console.log("each", item, index, arr);
});
</script>
The General Idea (Why I thought this was worth sharing)
The idea is to allow the callback to decide at runtime whether the loop will be synchronous or asynchronous. By using this
in a creative way (in situations where that value isn't already spoken for), an entire control API can be offered without over-complicating function signatures.
forEach(arr, function(item, index) {
});
forEach(arr, function(item, index) {
var done = this.async();
setTimeout(done, 1000);
});
forEach(arr, function(item, index) {
return index !== 1;
});
forEach(arr, function(item, index) {
var done = this.async();
setTimeout(function() {
done(index !== 1);
});
});
Examples
See the unit tests for more examples.
function allDone(notAborted, arr) {
console.log("done", notAborted, arr);
}
forEach(["a", "b", "c"], function(item, index, arr) {
console.log("each", item, index, arr);
}, allDone);
forEach(["a", "b", "c"], function(item, index, arr) {
console.log("each", item, index, arr);
if (item === "b") { return false; }
}, allDone);
forEach(["a", "b", "c"], function(item, index, arr) {
console.log("each", item, index, arr);
var done = this.async();
setTimeout(function() {
done();
}, 500);
}, allDone);
forEach(["a", "b", "c"], function(item, index, arr) {
console.log("each", item, index, arr);
var done = this.async();
setTimeout(function() {
done(item !== "b");
}, 500);
}, allDone);
forEach(["a", "b", "c"], function(item, index, arr) {
console.log("each", item, index, arr);
var done = this.async()
done();
}, allDone);
forEach(["a", "b", "c"], function(item, index, arr) {
console.log("each", item, index, arr);
var done = this.async();
done(item !== "b");
}, allDone);
Contributing
In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using grunt.
Also, please don't edit files in the "dist" subdirectory as they are generated via grunt. You'll find source code in the "lib" subdirectory!
Release History
04/29/2013
v0.1.3
Removed hard Node.js version dependency.
11/17/2011
v0.1.2
Adding sparse array support.
Invalid length properties are now sanitized.
This closes issue #1 (like a boss).
11/11/2011
v0.1.1
Refactored code to be much simpler. Yay for unit tests!
11/11/2011
v0.1.0
Initial Release.
License
Copyright (c) 2012 "Cowboy" Ben Alman
Licensed under the MIT license.
http://benalman.com/about/license/