Skip to content

Instantly share code, notes, and snippets.

@willwhite
Last active December 28, 2015 19:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save willwhite/7549681 to your computer and use it in GitHub Desktop.
Save willwhite/7549681 to your computer and use it in GitHub Desktop.
Simple async in JavaScript
(function load(items, callback) {
var loaded = new Array(items.length);
var error;
items.forEach(function(item, i) {
getWidget(item, function(err, obj) {
error = error || err;
loaded[i] = err || obj;
if (loaded.filter(function(n) { return n; }).length === loaded.length) {
callback(error, loaded);
}
});
});
})(['foo', 'bar', 'baz'], function(err, results) {
console.log(err);
// [Error: bar is invalid]
console.log(results);
// [ { type: 'widget', id: 'foo' },
// [Error: bar is invalid],
// { type: 'widget', id: 'baz' } ]
});
function getWidget(arg, callback) {
// Force error to demonstrate error handling.
if (arg === 'bar') return callback(new Error('bar is invalid'));
return callback(null, {type: 'widget', id: arg});
}
(function load(results, callback) {
if (!results.widget) return getWidget('foo', function(err, widget) {
if (err) return callback(err);
results.widget = widget;
load(results, callback);
});
if (!results.gadget) return getGadget('bar', function(err, gadget) {
if (err) return callback(err);
results.gadget = gadget;
load(results, callback);
});
callback(null, results);
})({}, function(err, results) {
console.log(results);
// { widget: { type: 'widget', id: 'foo' },
// gadget: { type: 'gadget', id: 'bar' } }
});
function getWidget(arg, callback) {
return callback(null, {type: 'widget', id: arg});
}
function getGadget(arg, callback) {
return callback(null, {type: 'gadget', id: arg});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment