import initialParams from './internal/initialParams'; import rest from 'lodash/_baseRest'; /** * 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' * }); */ export default function reflect(fn) { return initialParams(function reflectOn(args, reflectCallback) { args.push(rest(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); }); }