diff options
author | Alexander Early <alex@npmjs.com> | 2018-06-10 20:54:42 -0700 |
---|---|---|
committer | Alexander Early <alex@npmjs.com> | 2018-06-10 20:54:42 -0700 |
commit | aca50cd54f658e4672ed85121629520b895ae93d (patch) | |
tree | 2e70fabeb3157b4118bde6bedc0be742be3e08c8 | |
parent | 01b91e73c278260d088431695fb5d0b2e9471d40 (diff) | |
download | async-aca50cd54f658e4672ed85121629520b895ae93d.tar.gz |
happy path async funtions in asyncify
-rw-r--r-- | lib/asyncify.js | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/lib/asyncify.js b/lib/asyncify.js index e6d63c0..168f88a 100644 --- a/lib/asyncify.js +++ b/lib/asyncify.js @@ -1,5 +1,6 @@ import initialParams from './internal/initialParams'; import setImmediate from './internal/setImmediate'; +import { isAsync } from './internal/wrapAsync' /** * Take a sync function and make it async, passing its return value to a @@ -58,6 +59,14 @@ import setImmediate from './internal/setImmediate'; * q.push(files); */ export default function asyncify(func) { + if (isAsync(func)) { + return function (...args/*, callback*/) { + const callback = args.pop() + const promise = func.apply(this, args) + return handlePromise(promise, callback) + } + } + return initialParams(function (args, callback) { var result; try { @@ -67,25 +76,25 @@ export default function asyncify(func) { } // if result is Promise object if (result && typeof result.then === 'function') { - result.then(function(value) { - invokeCallback(callback, null, value); - }, function(err) { - invokeCallback(callback, err.message ? err : new Error(err)); - }); + return handlePromise(result, callback) } else { callback(null, result); } }); } +function handlePromise(promise, callback) { + return promise.then(value => { + invokeCallback(callback, null, value); + }, err => { + invokeCallback(callback, err.message ? err : new Error(err)); + }); +} + function invokeCallback(callback, error, value) { try { callback(error, value); - } catch (e) { - setImmediate(rethrow, e); + } catch (err) { + setImmediate(e => { throw e }, err); } } - -function rethrow(error) { - throw error; -} |