Last active
January 4, 2016 10:06
-
-
Save volodymyrprokopyuk/438cc44b223566f0db1a to your computer and use it in GitHub Desktop.
Promise Utils (JavaScript)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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