salix/modules/account/back/util/promisify.js

48 lines
1.1 KiB
JavaScript

module.exports = {
promisify,
promisifyObject
};
/**
* Promisifies a function wich follows the (err, res) => {} pattern as last
* function argument and returns the promisified version.
*
* @param {Function} fn Function to promisify
* @return {Function} The promisified function
*/
function promisify(fn) {
return function(...args) {
let thisArg = this;
let orgCb = args[args.length - 1];
if (typeof orgCb !== 'function') orgCb = null;
return new Promise(function(resolve, reject) {
function cb(err, res) {
if (orgCb) orgCb(err, res);
err ? reject(err) : resolve(res);
}
if (orgCb)
args[args.length - 1] = cb;
else
args.push(cb);
fn.apply(thisArg, args);
});
};
}
/**
* Promisifies object methods.
*
* @param {Object} obj Object to promisify
* @param {Array<String>} methods Array of method names to promisify
*/
function promisifyObject(obj, methods) {
for (let method of methods) {
let orgMethod = obj[method];
obj[method] = promisify(orgMethod);
}
}