diff options
author | Alexander Early <alexander.early@gmail.com> | 2015-07-09 10:37:31 -0700 |
---|---|---|
committer | Alexander Early <alexander.early@gmail.com> | 2015-07-09 10:37:31 -0700 |
commit | e82ce4b6dcf87d3bad561669caad33596266bfa4 (patch) | |
tree | dd6c7ff7cf3d30aa553b8c31bf7e9f5aedadbdb4 | |
parent | 7ea45d7fc816235003d319e1ce96582a4c65d77a (diff) | |
parent | 97f9825362a9f2d0f2e9ec9c113c38118b5d7d60 (diff) | |
download | async-e82ce4b6dcf87d3bad561669caad33596266bfa4.tar.gz |
Merge pull request #840 from zartdinov/master
asyncify promisified functions
-rw-r--r-- | lib/async.js | 11 | ||||
-rw-r--r-- | package.json | 4 | ||||
-rwxr-xr-x | test/test-async.js | 50 |
3 files changed, 63 insertions, 2 deletions
diff --git a/lib/async.js b/lib/async.js index 2f8290c..32a2d82 100644 --- a/lib/async.js +++ b/lib/async.js @@ -1189,7 +1189,16 @@ } catch (e) { return callback(e); } - callback(null, result); + // if result is Promise object + if (typeof result !== 'undefined' && typeof result.then === "function") { + result.then(function(value) { + callback(null, value); + }).catch(function(err) { + callback(err.message ? err : new Error(err)); + }); + } else { + callback(null, result); + } }); }; diff --git a/package.json b/package.json index 754deb5..e2707b9 100644 --- a/package.json +++ b/package.json @@ -20,13 +20,17 @@ "license": "MIT", "devDependencies": { "benchmark": "bestiejs/benchmark.js", + "bluebird": "^2.9.32", "coveralls": "^2.11.2", + "es6-promise": "^2.3.0", "jscs": "^1.13.1", "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", "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 7bc46e6..fdb949b 100755 --- a/test/test-async.js +++ b/test/test-async.js @@ -4267,5 +4267,53 @@ exports['asyncify'] = { test.ok(e.message === "callback error"); test.done(); } - } + }, + + 'promisified': [ + 'native-promise-only', + 'bluebird', + '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; + } + promises[name] = { + 'resolve': function(test) { + var promisified = function(argument) { + return new 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 Promise(function (resolve, reject) { + reject(argument + " rejected"); + }); + }; + async.asyncify(promisified)("argument", function (err) { + test.ok(err); + test.ok(err.message === "argument rejected"); + test.done(); + }); + } + }; + return promises; + }, {}) }; |