Promise.promisify = function (fnThatTakesCallbacks) { return function () { var args = [].slice.call(arguments); return new Promise(function (resolve, reject) { fnThatTakesCallbacks.apply(this, args.concat(function (err) { if (err) return reject(err); var restOfArgs = [].slice.call(arguments, 1); if (restOfArgs.length < 2) { resolve(restOfArgs[0]); } else { resolve(restOfArgs); } })); }); }; };