Node.js 中间件原理
const app = {
middleware: [],
callback (ctx) {
console.log(ctx)
},
use (fn) {
this.middleware.push(fn)
},
go (ctx) {
this.middleware.reduceRight((next, fn, i) => {
return () => {
console.log('next: ', next)
console.log('fn: ', fn)
fn(ctx, next)
}
}, this.callback.bind(this, ctx))()
}
}
app.use((ctx, next) => {
ctx.name = 'Lucy'
next()
})
app.use((ctx, next) => {
ctx.age = 12
next()
})
app.use((ctx, next) => {
console.log(`${ctx.name} is ${ctx.age} years old.`)
next()
})
app.go({})
上面代码的执行结果是
next: () => {
console.log('next: ', next)
console.log('fn: ', fn)
fn(ctx, next)
}
fn: (ctx, next) => {
ctx.name = 'Lucy'
next()
}
next: () => {
console.log('next: ', next)
console.log('fn: ', fn)
fn(ctx, next)
}
fn: (ctx, next) => {
ctx.age = 12
next()
}
next: ƒ callback(ctx) {
console.log(ctx)
}
fn: (ctx, next) => {
console.log(`${ctx.name} is ${ctx.age} years old.`)
next()
}
Lucy is 12 years old.
{name: "Lucy", age: 12}
有没有大佬能解释一下执行结果为啥是这个
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
可以看一下reduceRight
第一个参数是上次调用回调的返回值也就是next
第二个参数是当前元素值
reduceRight从右往左执行,执行完毕将最后一步也就是数组的第一位的回调返回并将第二位的回调以参数next的形式传入,然后以此类推,最后调用callbakc方法