Skip to content

Instantly share code, notes, and snippets.

@raoulmillais
Created March 23, 2015 16:50
Show Gist options
  • Save raoulmillais/11013f1e495355c784df to your computer and use it in GitHub Desktop.
Save raoulmillais/11013f1e495355c784df to your computer and use it in GitHub Desktop.
Waterfall stolen from async-waterfall with multi-environment boilerplate removed
waterfall([
function createBasket(cb) {
api.Basket().create({ artistid: 1 }, function processReleases(err, res) {
if (err) { return cb(err); }
basketId = res.basket.id;
console.log('Created basket', basketId);
return cb();
});
},
function addToBasket(cb) {
api.Basket().addItem({
basketId: basketId,
releaseId: 769006,
trackId: 13166687 // Test content
}, function (err, res) {
if (err) { return cb(err); }
console.log('Added to basket: ', res.basket.basketItems[0]);
return cb();
});
},
function applyVoucher(cb) {
api.Basket().applyVoucher({
basketId: basketId,
voucherCode: voucherCode
}, function (err, res) {
if (err) { return cb(err); }
console.log('Applied voucher to: ', res.basket.basketItems[0]);
return cb();
});
}
], function (err) {
if (err) { throw err; }
console.log('Example completed successfully');
});
var makeIterator = 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);
};
var waterfall = function (tasks, callback) {
callback = callback || function () {};
if (!Array.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);
}
setImmediate(function () {
iterator.apply(null, args);
});
}
};
};
wrapIterator(makeIterator(tasks))();
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment