You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							110 lines
						
					
					
						
							3.4 KiB
						
					
					
				
			
		
		
	
	
							110 lines
						
					
					
						
							3.4 KiB
						
					
					
				'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']; |