ts
// 最小中间件实现,接收一个函数 handel 作为最终执行的函数,当执行 runMiddlewareHandel 时等价于执行 Handel
// 通过 use 注册中间件,类似于洋葱路由,先注册的先执行
type FuncMiddlewares any> = ((ctx: Parameters, next: Handel) => ReturnType)
class middlewareRunner any>{
middlewares: FuncMiddlewares[] = []
constructor(public handel: Handel) { }
use(middleware: FuncMiddlewares) { this.middlewares.push(middleware) }
runMiddlewareHandel(...ctx: Parameters) {
let index = 0
const next = ((...ctx2: Parameters) => {
const middleware = this.middlewares[index]
index++
if (middleware === undefined) {
return this.handel.call(this, ...ctx2)
}
return middleware(ctx2, next)
}) as Handel
return next.call(this, ...ctx)
}
}
// 最终处理事物的函数
async function handel(a: number) {
return (a + 1)
}
// 某个中间件
const middlewareA: FuncMiddlewares = async (ctx, next) => {
// 处理上下文
const newCtx = ctx.map(v => v + v)
// 让其他中间件继续处理
const value = await next(newCtx[0])
// 处理返回值
return value + 1
}
const m = new middlewareRunner(handel)
m.use(middlewareA) // 4
m.runMiddlewareHandel(1).then(console.log)