misc/chain.js

/**
 * 链式调用函数
 * @author jay0815
 * @category misc
 * @alias misc_chain
 * @param  {...any} funcs 函数数组
 * @returns {function} 返回一个函数。
 * @summary 该函数接受任意数量的参数,并将这些参数依次传递给函数数组中的每个函数。
 * 第一个函数接收原始参数,后续函数接收前一个函数的返回值,最终返回最后一个函数的结果。
 * @example
 * const add = (x) => x + 1;
 * const multiply = (x) => x * 2;
 * const subtract = (x) => x - 3;
 * const chainedFunction = misc_chain(add, multiply, subtract);
 * console.log("调用链式函数并输出结果", chainedFunction(5)); // (5 + 1) * 2 - 3 = 9
 * @example
 * const toUpperCase = (str) => str.toUpperCase();
 * const addExclamation = (str) => str + '!';
 * const repeat = (str) => str + str;
 * const shout = misc_chain(toUpperCase, addExclamation, repeat);
 * console.log("调用链式函数并输出结果",shout('hello')); // "HELLO!HELLO!"
 */
export default (...funcs) => {
  return (...args) => {
    // 执行第一个函数,并将结果作为初始值传递给 reduce
    return funcs.reduce(
      (acc, fn, index) => {
        if (typeof fn === 'function') {
          // 如果是第一个函数,直接执行并返回结果作为初始值
          if (index === 0) {
            return fn(...args);
          }
          // 对于后续的函数,使用前一个函数的结果作为参数
          return fn(acc);
        }
        throw new Error(`第${index}个参数必须是一个函数`);
      },
      void 0
    );
  };
};