Sunny-117 / js-challenges

✨✨✨ Challenge your JavaScript programming limits step by step

Home Page:https://juejin.cn/column/7244788137410560055

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

函数组合 compose redux-saga koa 洋葱模型

Sunny-117 opened this issue · comments

// 用法如下:
function fn1(x) {
  return x + 1;
}
function fn2(x) {
  return x + 2;
}
function fn3(x) {
  return x + 3;
}
function fn4(x) {
  return x + 4;
}
const a = compose(fn1, fn2, fn3, fn4);
console.log(a(1)); // 1+4+3+2+1=11


function compose(...fn) {
  if (!fn.length) return (v) => v;
  if (fn.length === 1) return fn[0];
  return fn.reduce(
    (pre, cur) =>
    (...args) =>
    pre(cur(...args))
  );
}
function compose(...middlewares) {
  return function (ctx) {
    let index = -1;

    function dispatch(i) {
      index = i;
      const fn = middlewares[i];
      if (!fn) return Promise.resolve();

      try {
        return Promise.resolve(fn(ctx, () => dispatch(i + 1)));
      } catch (err) {
        return Promise.reject(err);
      }
    }

    return dispatch(0);
  };
}

async function middleware1(ctx, next) {
  console.log("Middleware 1 before");
  await next();
  console.log("Middleware 1 after");
}

async function middleware2(ctx, next) {
  console.log("Middleware 2 before");
  await next();
  console.log("Middleware 2 after");
}

async function middleware3(ctx, next) {
  console.log("Middleware 3 before");
  await next();
  console.log("Middleware 3 after");
}

const fn = compose(middleware1, middleware2, middleware3);

fn({}).catch((err) => console.error(err));
function compose(...middlewares) {
  return function (ctx) {
    let index = -1;

    function dispatch(i) {
      index = i;
      const fn = middlewares[i];
      if (!fn) return Promise.resolve();

      try {
        return Promise.resolve(fn(ctx, () => dispatch(i + 1)));
      } catch (err) {
        return Promise.reject(err);
      }
    }

    return dispatch(0);
  };
}

async function middleware1(ctx, next) {
  console.log("Middleware 1 before");
  await next();
  console.log("Middleware 1 after");
}

async function middleware2(ctx, next) {
  console.log("Middleware 2 before");
  await next();
  console.log("Middleware 2 after");
}

async function middleware3(ctx, next) {
  console.log("Middleware 3 before");
  await next();
  console.log("Middleware 3 after");
}

const fn = compose(middleware1, middleware2, middleware3);

fn({}).catch((err) => console.error(err));

有点疑惑,try catch无法捕捉Promise.resolve异步代码的的报错吧~