| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 | 'use strict';Object.defineProperty(exports, "__esModule", {    value: true});exports.default = asyncify;var _initialParams = require('./internal/initialParams.js');var _initialParams2 = _interopRequireDefault(_initialParams);var _setImmediate = require('./internal/setImmediate.js');var _setImmediate2 = _interopRequireDefault(_setImmediate);var _wrapAsync = require('./internal/wrapAsync.js');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) {    if ((0, _wrapAsync.isAsync)(func)) {        return function (...args /*, callback*/) {            const callback = args.pop();            const promise = func.apply(this, args);            return handlePromise(promise, callback);        };    }    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 (result && typeof result.then === 'function') {            return handlePromise(result, callback);        } else {            callback(null, result);        }    });}function handlePromise(promise, callback) {    return promise.then(value => {        invokeCallback(callback, null, value);    }, err => {        invokeCallback(callback, err && (err instanceof Error || err.message) ? err : new Error(err));    });}function invokeCallback(callback, error, value) {    try {        callback(error, value);    } catch (err) {        (0, _setImmediate2.default)(e => {            throw e;        }, err);    }}module.exports = exports.default;
 |