函数合成(compose)的多种实现原理

Posted machinist

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数合成(compose)的多种实现原理相关的知识,希望对你有一定的参考价值。

// 责任链模型(一个接一个执行)

const fn1 = (x, y) => x + y;
const fn2 = (z) => z * z;

// 正常组合

const compose = (fn1, ...other) => (...args) => {
  let ret = fn1(...args);
  other.forEach(item => {
    ret = item(ret);
  });
  return ret;
}

// redux 中间件组合方式

const reduxCompose = (...fns) => fns.reduce((a, b) => (...args) => b(a(...args)))

const fn = reduxCompose(fn1, fn2);

console.log(fn(1, 2));

// 洋葱圈模型(一半一半执行)

const koaCompose = (middlewares) => {
  return function () {
    return dispatch(0);
    function dispatch(idx) {
      const fn = middlewares[idx];
      if (!fn) {
        return Promise.resolve();
      }
      return Promise.resolve(
        fn(function next() {
          return dispatch(idx + 1)
        })
      )
    }
  }
};

async function func1(next) {
  console.log("func1");
  await next();
  console.log("func1 end");
}
async function func2(next) {
  console.log("func2");
  await delay();
  await next();
  console.log("func2 end");
}
async function func3(next) {
  console.log("func3");
}
async function delay() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve();
    }, 2000);
  })
}
const middlewares = [func1, func2, func3];
const finaFn = koaCompose(middlewares);
finaFn()

以上是关于函数合成(compose)的多种实现原理的主要内容,如果未能解决你的问题,请参考以下文章

函数式编程-函数的合成与柯里化

Laravel基本使用

深入理解 Compose Navigation 实现原理

深入理解 Compose Navigation 实现原理

深入理解 Compose Navigation 实现原理

一文看懂 Compose Navigation 实现原理