'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = reflect; var _initialParams = require('./internal/initialParams'); var _initialParams2 = _interopRequireDefault(_initialParams); var _baseRest = require('lodash/_baseRest'); var _baseRest2 = _interopRequireDefault(_baseRest); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Wraps the function in another function that always returns data even when it * errors. * * The object returned has either the property `error` or `value`. * * @name reflect * @static * @memberOf module:Utils * @method * @category Util * @param {Function} fn - The function you want to wrap * @returns {Function} - A function that always passes null to it's callback as * the error. The second argument to the callback will be an `object` with * either an `error` or a `value` property. * @example * * async.parallel([ * async.reflect(function(callback) { * // do some stuff ... * callback(null, 'one'); * }), * async.reflect(function(callback) { * // do some more stuff but error ... * callback('bad stuff happened'); * }), * async.reflect(function(callback) { * // do some more stuff ... * callback(null, 'two'); * }) * ], * // optional callback * function(err, results) { * // values * // results[0].value = 'one' * // results[1].error = 'bad stuff happened' * // results[2].value = 'two' * }); */ function reflect(fn) { return (0, _initialParams2.default)(function reflectOn(args, reflectCallback) { args.push((0, _baseRest2.default)(function callback(err, cbArgs) { if (err) { reflectCallback(null, { error: err }); } else { var value = null; if (cbArgs.length === 1) { value = cbArgs[0]; } else if (cbArgs.length > 1) { value = cbArgs; } reflectCallback(null, { value: value }); } })); return fn.apply(this, args); }); } module.exports = exports['default'];