Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

koa 风格的中间件设计

  koa 风格的中间件设计我觉得在同类设计中应该是最好的了。它将每一个中间件都视为一个基于 Promise 的异步模块,所有这些异步模块共享一个上下文对象,并且每个模块都可以选择性地把操作传给其后的中间件,最后由底层中间件再把 Promise 结果一层层冒泡地回收。

  对于每个中间件而言,next 之前和之后做的事情是不同的概念,next 之前做的是正向传递的事情,next 之后做的是逆向冒泡的事情。而且每个组件还可以根据业务的不同选择不调用 next 来忽略后续的中间件。
  这样一套中间件机制的实现其实并不复杂,比如下面这坨代码就是一个简易版
class App { constructor() { this.handlers = []; } use(...args) { this.handlers.push(...args); } call(ctx, index = 0) { // 如果后续已经没有其他中间件就直接返回 if (index >= this.handlers.length) return null; // 取出当前中间件以便后续使用 let handler = this.handlers[index]; // 如果中间件不是一个函数则忽略掉 if (typeof handler !== 'function') return chains(ctx, index + 1); // 调用中间件,传入上下文和 next,这个 next 被调用时将进入下一个中间件处理 return handler(ctx, () => this.call(ctx, index + 1)); } } let app = new App(); app.use((ctx, next) => { ctx.i++; next(); }); app.use((ctx, next) => { ctx.i *= 2; next(); }); let ctx = { i: 1 }; Promise.resolve(app.call(ctx)).then(() => { console.log(ctx); // { i: 4 } });   如果我们自己的框架可以直接沿用这种风格的中间件设计,那么很多 koa 生态圈中的中间件就可以直接拿过来用。虽然这还不是一套真正的规范,但我相信将来一定会有一套类似的规范出现的。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^