src/scripts/utils/async.js
//Small subset of async
var utilities = require('./utilityFunctions');
var async = {};
async.setImmediate = function (fn) {
setTimeout(fn, 0);
};
async.iterator = function (tasks) {
var makeCallback = function (index) {
var fn = function () {
if (tasks.length) {
tasks[index].apply(null, arguments);
}
return fn.next();
};
fn.next = function () {
return (index < tasks.length - 1) ? makeCallback(index + 1) : null;
};
return fn;
};
return makeCallback(0);
};
async.waterfall = function (tasks, callback) {
callback = callback || function () { };
if (!utilities.isArray(tasks)) {
var err = new Error('First argument to waterfall must be an array of functions');
return callback(err);
}
if (!tasks.length) {
return callback();
}
var wrapIterator = function (iterator) {
return function (err) {
if (err) {
callback.apply(null, arguments);
callback = function () {
};
}
else {
var args = Array.prototype.slice.call(arguments, 1);
var next = iterator.next();
if (next) {
args.push(wrapIterator(next));
}
else {
args.push(callback);
}
async.setImmediate(function () {
iterator.apply(null, args);
});
}
};
};
wrapIterator(async.iterator(tasks))();
};
async.when = function (condition, callback) {
if (!utilities.isFunction(callback)) {
throw new Error("async.when error: missing callback argument");
}
var isAllowed = utilities.isFunction(condition) ? condition : function () {
return !!condition;
};
return function () {
var args = utilities.arrayLikeObjToArray(arguments);
var next = args.pop();
if (isAllowed.apply(null, args)) {
return callback.apply(this, arguments);
}
args.unshift(null);
return next.apply(null, args);
};
};
module.exports = async;