| 'use strict'; |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.default = asyncify; |
| |
| var _isObject = require('lodash/isObject'); |
| |
| var _isObject2 = _interopRequireDefault(_isObject); |
| |
| var _initialParams = require('./internal/initialParams'); |
| |
| var _initialParams2 = _interopRequireDefault(_initialParams); |
| |
| var _setImmediate = require('./internal/setImmediate'); |
| |
| var _setImmediate2 = _interopRequireDefault(_setImmediate); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| /** |
| * Take a sync function and make it async, passing its return value to a |
| * callback. This is useful for plugging sync functions into a waterfall, |
| * series, or other async functions. Any arguments passed to the generated |
| * function will be passed to the wrapped function (except for the final |
| * callback argument). Errors thrown will be passed to the callback. |
| * |
| * If the function passed to `asyncify` returns a Promise, that promises's |
| * resolved/rejected state will be used to call the callback, rather than simply |
| * the synchronous return value. |
| * |
| * This also means you can asyncify ES2017 `async` functions. |
| * |
| * @name asyncify |
| * @static |
| * @memberOf module:Utils |
| * @method |
| * @alias wrapSync |
| * @category Util |
| * @param {Function} func - The synchronous function, or Promise-returning |
| * function to convert to an {@link AsyncFunction}. |
| * @returns {AsyncFunction} An asynchronous wrapper of the `func`. To be |
| * invoked with `(args..., callback)`. |
| * @example |
| * |
| * // passing a regular synchronous function |
| * async.waterfall([ |
| * async.apply(fs.readFile, filename, "utf8"), |
| * async.asyncify(JSON.parse), |
| * function (data, next) { |
| * // data is the result of parsing the text. |
| * // If there was a parsing error, it would have been caught. |
| * } |
| * ], callback); |
| * |
| * // passing a function returning a promise |
| * async.waterfall([ |
| * async.apply(fs.readFile, filename, "utf8"), |
| * async.asyncify(function (contents) { |
| * return db.model.create(contents); |
| * }), |
| * function (model, next) { |
| * // `model` is the instantiated model object. |
| * // If there was an error, this function would be skipped. |
| * } |
| * ], callback); |
| * |
| * // es2017 example, though `asyncify` is not needed if your JS environment |
| * // supports async functions out of the box |
| * var q = async.queue(async.asyncify(async function(file) { |
| * var intermediateStep = await processFile(file); |
| * return await somePromise(intermediateStep) |
| * })); |
| * |
| * q.push(files); |
| */ |
| function asyncify(func) { |
| return (0, _initialParams2.default)(function (args, callback) { |
| var result; |
| try { |
| result = func.apply(this, args); |
| } catch (e) { |
| return callback(e); |
| } |
| // if result is Promise object |
| if ((0, _isObject2.default)(result) && typeof result.then === 'function') { |
| result.then(function (value) { |
| invokeCallback(callback, null, value); |
| }, function (err) { |
| invokeCallback(callback, err.message ? err : new Error(err)); |
| }); |
| } else { |
| callback(null, result); |
| } |
| }); |
| } |
| |
| function invokeCallback(callback, error, value) { |
| try { |
| callback(error, value); |
| } catch (e) { |
| (0, _setImmediate2.default)(rethrow, e); |
| } |
| } |
| |
| function rethrow(error) { |
| throw error; |
| } |
| module.exports = exports['default']; |