DEV Community

leokun
leokun

Posted on

compose middleware

const compose = (...middlewares) =>
  (middlewares || []).reverse().reduce(
    (dispatch, middleware) => {
      return async (ctx, next) => {
        return await middleware(ctx, async () => await dispatch(ctx, next));
      };
    },
    async (ctx, next) => await next?.(ctx)
  );

Enter fullscreen mode Exit fullscreen mode

Satisfy the law of combination

const loader = compose(
    async (ctx, next) => {
        console.log(1, ctx.name);
        await next();
        console.log(6, ctx.name);
    },
    async (ctx, next) => {
        console.log(2, ctx.name);
        await next();
        console.log(5, ctx.name);
    },
    async (ctx, next) => {
        console.log(3, ctx.name);
        await next();
        console.log(4, ctx.name);
    }
);
const loader1 = compose(
    async (ctx, next) => {
        console.log("1-1", ctx.name);
        await next();
        console.log("1-6", ctx.name);
    },
    async (ctx, next) => {
        console.log("1-2", ctx.name);
        await next();
        console.log("1-5", ctx.name);
    },
    async (ctx, next) => {
        console.log("1-3", ctx.name);
        await next();
        console.log("1-4", ctx.name);
    }
);
// compose return  another middleware
const loader2 = compose(loader, loader1);
const loader3 = compose(loader, loader1, loader2);
const loader4 = compose(loader, loader1, loader2, loader3);
const loader5 = compose(loader, loader1, loader2, loader3, loader4);

loader5({name:1},(ctx)=>{
    console.log("middle",ctx)
})
Enter fullscreen mode Exit fullscreen mode

Top comments (0)