From b89b1acf95188bc74e3e528a72bf22ce30e1b677 Mon Sep 17 00:00:00 2001 From: zartdinov Date: Wed, 8 Jul 2015 18:57:25 +0000 Subject: asyncify Promises --- lib/async.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/async.js b/lib/async.js index cbd2678..d9e6244 100644 --- a/lib/async.js +++ b/lib/async.js @@ -1186,10 +1186,18 @@ var result; try { result = func.apply(this, args); + // if result is Promise object + if (typeof result.then === "function") { + result.then(function(values) { + var args = [null].concat(values); + callback.apply(this, args); + }).catch(callback); + } else { + callback(null, result); + } } catch (e) { return callback(e); } - callback(null, result); }); }; -- cgit v1.2.1 From 3c2fd71e350f6a5cda22696ed7cc2022fe566128 Mon Sep 17 00:00:00 2001 From: Aydar Zartdinov Date: Thu, 9 Jul 2015 06:05:43 +0300 Subject: callback moved out from try/catch block unit tests for es6-promise and rsvp --- lib/async.js | 19 +++++++------- package.json | 2 ++ test/test-async.js | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 9 deletions(-) diff --git a/lib/async.js b/lib/async.js index d9e6244..84d17aa 100644 --- a/lib/async.js +++ b/lib/async.js @@ -1186,18 +1186,19 @@ var result; try { result = func.apply(this, args); - // if result is Promise object - if (typeof result.then === "function") { - result.then(function(values) { - var args = [null].concat(values); - callback.apply(this, args); - }).catch(callback); - } else { - callback(null, result); - } } catch (e) { return callback(e); } + // if result is Promise object + if (typeof result !== 'undefined' && typeof result.then === "function") { + result.then(function(value) { + callback(null, value); + }).catch(function(err) { + callback(new Error(err)); + }); + } else { + callback(null, result); + } }); }; diff --git a/package.json b/package.json index e26d3c6..2031fa3 100644 --- a/package.json +++ b/package.json @@ -21,11 +21,13 @@ "devDependencies": { "benchmark": "bestiejs/benchmark.js", "coveralls": "^2.11.2", + "es6-promise": "^2.3.0", "jshint": "~2.8.0", "lodash": "^3.9.0", "mkdirp": "~0.5.1", "nodeunit": ">0.0.0", "nyc": "^2.1.0", + "rsvp": "^3.0.18", "uglify-js": "~2.4.0", "xyz": "^0.5.0", "yargs": "~3.9.1" diff --git a/test/test-async.js b/test/test-async.js index cd7a2a1..e5b45f5 100755 --- a/test/test-async.js +++ b/test/test-async.js @@ -4267,5 +4267,81 @@ exports['asyncify'] = { test.ok(e.message === "callback error"); test.done(); } + }, + + 'es6-promise': { + 'setUp': function (callback) { + this.Promise = require('es6-promise').Promise; + callback(); + }, + + 'resolve': function(test) { + var promisified = function(argument) { + return new this.Promise(function (resolve) { + setTimeout(function () { + resolve(argument + " resolved"); + }, 15); + }); + }; + async.asyncify(promisified)("argument", function (err, value) { + if (err) { + return test.done(new Error(err)); + } + test.ok(value === "argument resolved"); + test.done(); + }); + }, + + 'reject': function(test) { + var promisified = function(argument) { + return new this.Promise(function (resolve, reject) { + reject(argument + " rejected"); + }); + }; + async.asyncify(promisified)("argument", function (err) { + console.log(err.message); + test.ok(err); + test.ok(err.message === "argument rejected"); + test.done(); + }); + } + }, + + 'rsvp': { + 'setUp': function (callback) { + this.Promise = require('rsvp').Promise; + callback(); + }, + + 'resolve': function(test) { + var promisified = function(argument) { + return new this.Promise(function (resolve) { + setTimeout(function () { + resolve(argument + " resolved"); + }, 15); + }); + }; + async.asyncify(promisified)("argument", function (err, value) { + if (err) { + return test.done(new Error(err)); + } + test.ok(value === "argument resolved"); + test.done(); + }); + }, + + 'reject': function(test) { + var promisified = function(argument) { + return new this.Promise(function (resolve, reject) { + reject(argument + " rejected"); + }); + }; + async.asyncify(promisified)("argument", function (err) { + console.log(err.message); + test.ok(err); + test.ok(err.message === "argument rejected"); + test.done(); + }); + } } }; -- cgit v1.2.1 From 4be3c68a8014acba23cde6d57f9a48efad31839c Mon Sep 17 00:00:00 2001 From: Aydar Zartdinov Date: Thu, 9 Jul 2015 06:39:47 +0300 Subject: ahh, forgot some console.log --- test/test-async.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/test-async.js b/test/test-async.js index f84777f..3eb1324 100755 --- a/test/test-async.js +++ b/test/test-async.js @@ -4299,7 +4299,6 @@ exports['asyncify'] = { }); }; async.asyncify(promisified)("argument", function (err) { - console.log(err.message); test.ok(err); test.ok(err.message === "argument rejected"); test.done(); @@ -4337,7 +4336,6 @@ exports['asyncify'] = { }); }; async.asyncify(promisified)("argument", function (err) { - console.log(err.message); test.ok(err); test.ok(err.message === "argument rejected"); test.done(); -- cgit v1.2.1 From 725fdb2aaaa114b23583067a7099d817f806b146 Mon Sep 17 00:00:00 2001 From: Aydar Zartdinov Date: Thu, 9 Jul 2015 07:25:46 +0300 Subject: unit test for bluebird promisified functions --- lib/async.js | 2 +- test/test-async.js | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/lib/async.js b/lib/async.js index e756854..32a2d82 100644 --- a/lib/async.js +++ b/lib/async.js @@ -1194,7 +1194,7 @@ result.then(function(value) { callback(null, value); }).catch(function(err) { - callback(new Error(err)); + callback(err.message ? err : new Error(err)); }); } else { callback(null, result); diff --git a/test/test-async.js b/test/test-async.js index 3eb1324..37322c3 100755 --- a/test/test-async.js +++ b/test/test-async.js @@ -4269,6 +4269,39 @@ exports['asyncify'] = { } }, + 'bluebird': { + 'setUp': function (callback) { + this.Promise = require('bluebird'); + callback(); + }, + + 'resolve': function(test) { + var promisified = this.Promise.promisify(function(argument, callback) { + setTimeout(function () { + callback(null, argument + " resolved"); + }, 15); + }); + async.asyncify(promisified)("argument", function (err, value) { + if (err) { + return test.done(new Error(err)); + } + test.ok(value === "argument resolved"); + test.done(); + }); + }, + + 'reject': function(test) { + var promisified = this.Promise.promisify(function(argument, callback) { + callback("argument rejected"); + }); + async.asyncify(promisified)("argument", function (err) { + test.ok(err); + test.ok(err.message === "argument rejected"); + test.done(); + }); + } + }, + 'es6-promise': { 'setUp': function (callback) { this.Promise = require('es6-promise').Promise; -- cgit v1.2.1 From dbcde702588d3837928a8beeefa4e046af20ac15 Mon Sep 17 00:00:00 2001 From: Aydar Zartdinov Date: Thu, 9 Jul 2015 07:32:17 +0300 Subject: test names modified to "promisified by ..." --- test/test-async.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/test-async.js b/test/test-async.js index 37322c3..4dc7bfb 100755 --- a/test/test-async.js +++ b/test/test-async.js @@ -4269,7 +4269,7 @@ exports['asyncify'] = { } }, - 'bluebird': { + 'promisified by bluebird': { 'setUp': function (callback) { this.Promise = require('bluebird'); callback(); @@ -4302,7 +4302,7 @@ exports['asyncify'] = { } }, - 'es6-promise': { + 'promisified by es6-promise': { 'setUp': function (callback) { this.Promise = require('es6-promise').Promise; callback(); @@ -4339,7 +4339,7 @@ exports['asyncify'] = { } }, - 'rsvp': { + 'promisified by rsvp': { 'setUp': function (callback) { this.Promise = require('rsvp').Promise; callback(); -- cgit v1.2.1 From 6f2530b838d3e9ab8178e48092388d78fae61721 Mon Sep 17 00:00:00 2001 From: Aydar Zartdinov Date: Thu, 9 Jul 2015 07:33:49 +0300 Subject: npm install --save-dev bluebird --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 99b49fc..fa0b1ec 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "license": "MIT", "devDependencies": { "benchmark": "bestiejs/benchmark.js", + "bluebird": "^2.9.32", "coveralls": "^2.11.2", "es6-promise": "^2.3.0", "jscs": "^1.13.1", -- cgit v1.2.1 From 479d36cf6ee1d6abfe3d2cf7da44e4d85de711be Mon Sep 17 00:00:00 2001 From: Aydar Zartdinov Date: Thu, 9 Jul 2015 07:39:34 +0300 Subject: added "should not get an error here" messages --- test/test-async.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/test-async.js b/test/test-async.js index 4dc7bfb..ebde554 100755 --- a/test/test-async.js +++ b/test/test-async.js @@ -4283,7 +4283,7 @@ exports['asyncify'] = { }); async.asyncify(promisified)("argument", function (err, value) { if (err) { - return test.done(new Error(err)); + return test.done(new Error("should not get an error here")); } test.ok(value === "argument resolved"); test.done(); @@ -4318,7 +4318,7 @@ exports['asyncify'] = { }; async.asyncify(promisified)("argument", function (err, value) { if (err) { - return test.done(new Error(err)); + return test.done(new Error("should not get an error here")); } test.ok(value === "argument resolved"); test.done(); @@ -4355,7 +4355,7 @@ exports['asyncify'] = { }; async.asyncify(promisified)("argument", function (err, value) { if (err) { - return test.done(new Error(err)); + return test.done(new Error("should not get an error here")); } test.ok(value === "argument resolved"); test.done(); -- cgit v1.2.1 From edee839eb23488f0e65376d43a49b68abfb61b67 Mon Sep 17 00:00:00 2001 From: Aydar Zartdinov Date: Thu, 9 Jul 2015 15:07:06 +0300 Subject: don't repeat yourself (DRY) --- test/test-async.js | 135 +++++++++++++---------------------------------------- 1 file changed, 32 insertions(+), 103 deletions(-) diff --git a/test/test-async.js b/test/test-async.js index ebde554..62e7e47 100755 --- a/test/test-async.js +++ b/test/test-async.js @@ -4269,110 +4269,39 @@ exports['asyncify'] = { } }, - 'promisified by bluebird': { - 'setUp': function (callback) { - this.Promise = require('bluebird'); - callback(); - }, - - 'resolve': function(test) { - var promisified = this.Promise.promisify(function(argument, callback) { - setTimeout(function () { - callback(null, argument + " resolved"); - }, 15); - }); - async.asyncify(promisified)("argument", function (err, value) { - if (err) { - return test.done(new Error("should not get an error here")); - } - test.ok(value === "argument resolved"); - test.done(); - }); - }, - - 'reject': function(test) { - var promisified = this.Promise.promisify(function(argument, callback) { - callback("argument rejected"); - }); - async.asyncify(promisified)("argument", function (err) { - test.ok(err); - test.ok(err.message === "argument rejected"); - test.done(); - }); - } - }, - - 'promisified by es6-promise': { - 'setUp': function (callback) { - this.Promise = require('es6-promise').Promise; - callback(); - }, - - 'resolve': function(test) { - var promisified = function(argument) { - return new this.Promise(function (resolve) { - setTimeout(function () { - resolve(argument + " resolved"); - }, 15); - }); - }; - async.asyncify(promisified)("argument", function (err, value) { - if (err) { - return test.done(new Error("should not get an error here")); - } - test.ok(value === "argument resolved"); - test.done(); - }); - }, - - 'reject': function(test) { - var promisified = function(argument) { - return new this.Promise(function (resolve, reject) { - reject(argument + " rejected"); - }); - }; - async.asyncify(promisified)("argument", function (err) { - test.ok(err); - test.ok(err.message === "argument rejected"); - test.done(); - }); - } - }, - - 'promisified by rsvp': { - 'setUp': function (callback) { - this.Promise = require('rsvp').Promise; - callback(); - }, - - 'resolve': function(test) { - var promisified = function(argument) { - return new this.Promise(function (resolve) { - setTimeout(function () { - resolve(argument + " resolved"); - }, 15); + 'promisified': ['bluebird', 'es6-promise', 'rsvp'].reduce(function(promises, name) { + var Promise = require(name).Promise; + promises[name] = { + 'resolve': function(test) { + var promisified = function(argument) { + return new this.Promise(function (resolve) { + setTimeout(function () { + resolve(argument + " resolved"); + }, 15); + }); + }; + async.asyncify(promisified)("argument", function (err, value) { + if (err) { + return test.done(new Error("should not get an error here")); + } + test.ok(value === "argument resolved"); + test.done(); }); - }; - async.asyncify(promisified)("argument", function (err, value) { - if (err) { - return test.done(new Error("should not get an error here")); - } - test.ok(value === "argument resolved"); - test.done(); - }); - }, + }, - 'reject': function(test) { - var promisified = function(argument) { - return new this.Promise(function (resolve, reject) { - reject(argument + " rejected"); + 'reject': function(test) { + var promisified = function(argument) { + return new this.Promise(function (resolve, reject) { + reject(argument + " rejected"); + }); + }; + async.asyncify(promisified)("argument", function (err) { + test.ok(err); + test.ok(err.message === "argument rejected"); + test.done(); }); - }; - async.asyncify(promisified)("argument", function (err) { - test.ok(err); - test.ok(err.message === "argument rejected"); - test.done(); - }); - } - } + } + }; + return promises; + }, {}) }; -- cgit v1.2.1 From 458c73cbd16100a28d60e8fefc9cd15447b19725 Mon Sep 17 00:00:00 2001 From: Aydar Zartdinov Date: Thu, 9 Jul 2015 15:14:41 +0300 Subject: not used Promise was fixed --- test/test-async.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test-async.js b/test/test-async.js index 62e7e47..3e237c6 100755 --- a/test/test-async.js +++ b/test/test-async.js @@ -4274,7 +4274,7 @@ exports['asyncify'] = { promises[name] = { 'resolve': function(test) { var promisified = function(argument) { - return new this.Promise(function (resolve) { + return new Promise(function (resolve) { setTimeout(function () { resolve(argument + " resolved"); }, 15); @@ -4291,7 +4291,7 @@ exports['asyncify'] = { 'reject': function(test) { var promisified = function(argument) { - return new this.Promise(function (resolve, reject) { + return new Promise(function (resolve, reject) { reject(argument + " rejected"); }); }; -- cgit v1.2.1 From 173e9133c064aaa22a699ba038754c5994783733 Mon Sep 17 00:00:00 2001 From: Aydar Zartdinov Date: Thu, 9 Jul 2015 15:44:30 +0300 Subject: unit test for NPO --- package.json | 1 + test/test-async.js | 12 ++++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index fa0b1ec..e2707b9 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "jshint": "~2.8.0", "lodash": "^3.9.0", "mkdirp": "~0.5.1", + "native-promise-only": "^0.8.0-a", "nodeunit": ">0.0.0", "nyc": "^2.1.0", "rsvp": "^3.0.18", diff --git a/test/test-async.js b/test/test-async.js index 3e237c6..844bce9 100755 --- a/test/test-async.js +++ b/test/test-async.js @@ -4269,8 +4269,16 @@ exports['asyncify'] = { } }, - 'promisified': ['bluebird', 'es6-promise', 'rsvp'].reduce(function(promises, name) { - var Promise = require(name).Promise; + 'promisified': [ + 'native-promise-only', + 'bluebird', + 'es6-promise', + 'rsvp' + ].reduce(function(promises, name) { + var Promise = require(name); + if (typeof Promise.Promise === 'function') { + Promise = Promise.Promise; + } promises[name] = { 'resolve': function(test) { var promisified = function(argument) { -- cgit v1.2.1 From 97f9825362a9f2d0f2e9ec9c113c38118b5d7d60 Mon Sep 17 00:00:00 2001 From: Aydar Zartdinov Date: Thu, 9 Jul 2015 20:15:01 +0300 Subject: node-only --- test/test-async.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/test-async.js b/test/test-async.js index 844bce9..fdb949b 100755 --- a/test/test-async.js +++ b/test/test-async.js @@ -4275,6 +4275,10 @@ exports['asyncify'] = { 'es6-promise', 'rsvp' ].reduce(function(promises, name) { + if (isBrowser()) { + // node only test + return; + } var Promise = require(name); if (typeof Promise.Promise === 'function') { Promise = Promise.Promise; -- cgit v1.2.1