Skip to content

Instantly share code, notes, and snippets.

@volodymyrprokopyuk
Last active January 4, 2016 10:06
Show Gist options
  • Save volodymyrprokopyuk/438cc44b223566f0db1a to your computer and use it in GitHub Desktop.
Save volodymyrprokopyuk/438cc44b223566f0db1a to your computer and use it in GitHub Desktop.
Promise Utils (JavaScript)
var _ = require('lodash');
var Promise = require('bluebird');
var recursive = function(obj, proc, pred) {
pred = pred || _.partial(_.identity, true);
(function recurse(parent, val, key) {
_.isObject(val) ? _.map(val, _.partial(recurse, val))
: pred(val) && (parent[key] = proc(val));
})(null, obj);
};
var pipe = function(tasks, seed) {
return Promise.reduce(tasks, function(arg, task) { return task(arg); }
, seed || null);
};
var tryPipe = function(tasks, seed) {
return Promise.try(_.partial(pipe, tasks, seed));
};
var pwhile = function(pred, act, seed) {
return new Promise(function(resolve, reject) {
(function loop(item) {
var forward = function(item) {
return pred(item) ? act(item).then(loop) : resolve(item);
};
return Promise.resolve(item).then(forward);
})(seed).catch(reject);
});
};
// recursive example
var escapeTeXChars = function(cv) {
var escapeChars = function(str) {
return str.replace(/[&%#_\$\{\}]/g, function(m) {
return '\\' + m;
});
};
recursive(cv, escapeChars, _.isString);
return cv;
};
// tryPipe example
var f1 = function(s) {
return Promise.resolve(s + ' f1');
return Promise.reject('error f1');
};
var f2 = function(s) {
return Promise.resolve(s + ' f2');
return Promise.reject('error f2');
};
var f3 = function(s) {
return Promise.resolve(s + ' f3');
return Promise.reject('error f3');
};
tryPipe([ f1, f2, f3, console.log ], 'start').catch(console.error);
// pwhile example
var start = function(val) { return Promise.resolve(val); };
var more = function(val) { return val < 5; };
var next = function(val) {
console.log(val);
return Promise.resolve(val + 1);
return (val === 3) ? Promise.reject('oh') : Promise.resolve(val + 1);
};
pwhile(more, next, start(0)).then(console.log).catch(console.error);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment