Sunny-117 / js-challenges

✨✨✨ Challenge your JavaScript programming limits step by step
https://juejin.cn/column/7244788137410560055
2k stars 236 forks source link

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

Open Sunny-117 opened 1 year ago

Sunny-117 commented 1 year ago
// 用法如下:
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))
  );
}
kangkang123269 commented 1 year ago
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));
tyust512 commented 11 months ago
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异步代码的的报错吧~