class MiddleWare {
constructor() {
this.init()
}
init () {
this.allFn = []
}
// 将fn丢入数组
use (fn) {
this.allFn.push(fn)
}
// 执行函数,挨个执行数组中的fn
run (ctx = {a: 'test'}, last = () => { console.log('middleware end') }) {
const that = this
let idx = -1 // -1表示当前未执行任何中间件
return dispatch(0) // 触发第1个中间件
function dispatch (i) {
idx = i // 设置当前下标
let fn = that.allFn[i] || last
try {
// 执行当前中间件的时候,给当前参数中的next参数赋值为一个函数,在这个函数中执行下个中间件
if (fn) fn(ctx, () => {
dispatch(i + 1) // 触发下一个中间件,将下标+1
})
} catch (err) { // 所有的中间件执行完毕,执行回调
last(ctx)
}
}
}
}
export { MiddleWare }