Skip to content

Instantly share code, notes, and snippets.

@ngryman
Created March 21, 2015 23:57
Show Gist options
  • Select an option

  • Save ngryman/a6bb794295854736ce0b to your computer and use it in GitHub Desktop.

Select an option

Save ngryman/a6bb794295854736ce0b to your computer and use it in GitHub Desktop.
Waterfall with promises.
function waterfall(tasks, callback) {
var firstTask = tasks.shift();
return tasks.reduce(function(prevPromise, task) {
return prevPromise.then(function() {
var args = Array.prototype.slice.call(arguments);
args.unshift(task);
return makePromise.apply(null, args);
});
}, makePromise(firstTask));
function makePromise(task) {
var args = Array.prototype.slice.call(arguments, 1);
return new Promise(function(resolve) {
function resolveProxy() {
console.timeEnd(task.displayName);
resolve.apply(null, arguments);
}
args.push(resolveProxy);
console.time(task.displayName);
var res = task.apply(null, args);
if (res) resolveProxy(res);
});
}
}
function waterfall(tasks, callback) {
var firstTask = tasks.shift();
return tasks.reduce(function(prevPromise, task) {
return prevPromise.then(function() {
var args = Array.prototype.slice.call(arguments);
args.unshift(task);
return makePromise.apply(null, args);
});
}, makePromise(firstTask));
function makePromise(task) {
var args = Array.prototype.slice.call(arguments, 1);
return new Promise(function(resolve) {
args.push(resolve);
var res = task.apply(null, args);
if (res) resolve(res);
});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment