Skip to content

Commit

Permalink
opt: #17 promisify performance
Browse files Browse the repository at this point in the history
  • Loading branch information
ysmood committed Oct 22, 2015
1 parent 8c8512f commit b336a4d
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 16 deletions.
47 changes: 31 additions & 16 deletions src/promisify.js
Original file line number Diff line number Diff line change
@@ -1,27 +1,42 @@
var _ = require("./_");
var isFn = _.isFunction;

module.exports = function (fn, self) {
return function () {
return function (a, b, c, d, e) {
var len = arguments.length
, args = new Array(len);
, args, promise, resolve, reject;

for (var i = 0; i < len; i++) {
args[i] = arguments[i];
promise = new _.Promise(function (r, rj) {
resolve = r;
reject = rj;
});

function cb (err, val) {
err == null ? resolve(val) : reject(err);
}

if (_.isFunction(args[len - 1])) {
return fn.apply(self, args);
switch (len) {
case 0: fn(cb); break;
case 1: isFn(a) ? fn(a) : fn(a, cb); break;
case 2: isFn(b) ? fn(a, b) : fn(a, b, cb); break;
case 3: isFn(c) ? fn(a, b, c) : fn(a, b, c, cb); break;
case 4: isFn(d) ? fn(a, b, c, d) : fn(a, b, c, d, cb); break;
case 5: isFn(e) ? fn(a, b, c, d, e) : fn(a, b, c, d, e, cb); break;
default:
args = new Array(len);

for (var i = 0; i < len; i++) {
args[i] = arguments[i];
}

if (isFn(args[len - 1])) {
return fn.apply(self, args);
}

args[i] = cb;
fn.apply(self, args);
}

return new _.Promise(function (resolve, reject) {
args.push(function () {
if (arguments[0] != null) {
return reject(arguments[0]);
} else {
return resolve(arguments[1]);
}
});
return fn.apply(self, args);
});
return promise;
};
};
20 changes: 20 additions & 0 deletions test/basic.js
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,26 @@ module.exports = function (it) { return [
return fn(0);
}),

it("promisify promise 2", 3, function () {
var fn;
fn = utils.promisify(function (a, b, cb) {
return setTimeout(function () {
return cb(null, a + b);
});
});
return fn(1, 2);
}),

it("promisify promise err", "err", function () {
var fn;
fn = utils.promisify(function (a, cb) {
return setTimeout(function () {
return cb(a);
});
});
return fn("err").catch(function (v) { return v });
}),

it("promisify callback", 1, function () {
var fn;
fn = utils.promisify(function (val, cb) {
Expand Down

0 comments on commit b336a4d

Please sign in to comment.