class app {middleware = [];// 装载中间件use(middleware) {this.middleware.push(middleware);}compose(callback) {// 把 要被触发的上一层洋葱壳 作为下一层洋葱壳的next入参传入。// reducer 的返回值,也就是下一层的next为 () => fn(next)。const reducer = (next, fn) => () => fn(next);// 第二个参数为洋葱的中心;可传入任意函数。(但必须传入函数)this.middleware.reduceRight(reducer, callback)();}
}

调用方法

const app = new app();function middleware1(next) {console.log('come in 1');next();console.log('come out 1');
}function middleware2(next) {console.log('come in 2');next();console.log('come out 2');
}function middleware3(next) {console.log('come in 3');next();console.log('come out 3');
}app.use(middleware1);app.use(middleware2);app.use(middleware3);app.compose(() => console.log('call controller'));

执行结果为

come in 1
come in 2
come in 3
call controller
come out 3
come out 2
come out 1
上述代码执行后 middleware为[middleware1, middleware2, middleware3];reduceRight生成的函数为() => middleware1(() => middleware2(() => middleware3(callback)))compose被调用后首先执行middleware1 打印 come in 1
然后执行至 middleware1的next接下来就执行middleware2 middleware3当执行至middleware3的next时,洋葱中心的callback被调用
所有next执行完毕
此时 middleware3 的 next() 之后的逻辑是 console.log('come out 3')
打印 come out 3 后,middleware3 执行完成
middleware3 执行完成则表示 middleware2 的 next() 执行完成
接下来执行middleware2 的 next() 后的逻辑
最后是 middleware1 的 next() 之后的逻辑。整个过程就像 一只虫子进入一个洋葱之中,洋葱从外到里一层一层地打开, 离开之后洋葱又从里到外一层一层地关闭。

Koa2——洋葱模型,简单实现相关推荐

  1. 描述Koa2洋葱模型

    基本上面试都会被问到,所以整理一下. Koa2中间件基于async/await实现的,其执行过程是通过next来驱动的.Koa2的中间件执行顺序的模型被称为洋葱模型. 官网所给示例: // logge ...

  2. koa2洋葱模型之为什么要保证洋葱模型

    这样的代码,按照洋葱模型,感觉打印顺序应该是1-3-4-2,其实结果是: 为什么? 因为中间件没有全部使用async和await 所以为了保证洋葱模型,我们必须在每个中间件上加上async和await ...

  3. axios 和洋葱模型中间件

    axios 和洋葱模型中间件 前言 MiddleWare类实现 HttpRequest类实现 使用 总结 前言 前段时间阅读了axios的源码,代码量不多,而且相对vue源码来说要简单很多,其中的设计 ...

  4. 学习 koa 源码的整体架构,浅析koa洋葱模型原理和co原理

    前言 这是学习源码整体架构系列第七篇.整体架构这词语好像有点大,姑且就算是源码整体结构吧,主要就是学习是代码整体结构,不深究其他不是主线的具体函数的实现.本篇文章学习的是实际仓库的代码. 学习源码整体 ...

  5. 洋葱模型php,koa 洋葱模型

    分析 1.首先这是koa2最简单的入门例子,我将通过这个入门例子来演示koa2的洋葱模型 const Koa = require('koa'); const app = new Koa(); app. ...

  6. 50行代码串行Promise,koa洋葱模型原来这么有趣?

    1. 前言 大家好,我是若川,最近组织了源码共读活动<1个月,200+人,一起读了4周源码>,感兴趣的可以加我微信 ruochuan12 参与,长期交流学习. 之前写的<学习源码整体 ...

  7. 如何更好地理解中间件和洋葱模型

    相信用过 Koa.Redux 或 Express 的小伙伴对中间件都不会陌生,特别是在学习 Koa 的过程中,还会接触到 "洋葱模型". 本文阿宝哥将跟大家一起来学习 Koa 的中 ...

  8. koa - 洋葱模型浅析

    1.什么是koa? Koa是一个精简的node框架,被认为是第二代Node框架,其最大的特点就是独特的中间件流程控制,是一个典型的洋葱模型,它的核心工作包括下面两个方面: 将node原生的req和re ...

  9. 你需要掌握的 Koa 洋葱模型和中间件

    大家好,我是前端西瓜哥. Koa 是一个 nodejs 框架,经常用于写 web 后端服务.它是 Express 框架的原班人马开发的新一代 web 框架,使用了 async / await 来优雅处 ...

最新文章

  1. vscode 使用ssh密钥登录远程Linux -- vscode remote linux ssh key
  2. mysql5.5与5.5版本关于修改字符集的方法
  3. 4python 解析库的使用
  4. cmake之 ADD_LIBRARY()
  5. OpenCV使用pointPolygonTest的实例(附完整代码)
  6. Linux的scan命令,linux的scan命令
  7. diveintopython3 official_Python 学习资料整理
  8. kafka通过控制台模拟消息发送和消息接收正常,但是通过javaAPI操作生产者发送消息不成功 消费者接收不到数据解决方案?
  9. 【优化】C#利用ODP.NET往oracle中高效插入百万数据
  10. 中国太阳能窗户市场趋势报告、技术动态创新及市场预测
  11. iscsi网络存储服务
  12. MySql执行Sql语句时出现“MySqlException: Parameter ‘@maxNo‘ must be defined.”的错误
  13. 拓端tecdat|python对网络图networkx进行社区检测和彩色绘图
  14. 嵌入式环境搭建之zmodem
  15. 最强Redis实战学习笔记,没有之一!
  16. 通信算法之三十:Turbo仿真链路开发基于《低压电力线宽带载波通信互联互通技术规范第4—1部分物理层通信协议》
  17. 教你一步解决添加和修改环境变量问题
  18. 算法-入门篇(欧式距离)
  19. 智能手表的突破和新发展机遇
  20. 12款免费图标生成器

热门文章

  1. 接口测试平台-93: 全局域名库表+存储
  2. crmeb一款最适合二次开发的开源微信公众号小程序框架 轻编程
  3. 如何选购阿里云服务器并快速入门(Windows版本)?
  4. win8右下角网络图标不见了_笔记本连接wifi的图标不见了怎么办_win8右下角wifi图标不见了的解决方法...
  5. 程序需求分析 | 假设你在卖铅笔
  6. Android调用uc播放器,android 视频播放 -- 调用系统播放器
  7. 【微信公众号】获取用户信息
  8. 保密相册计算机,‎加密相册 - 保密计算机私密云相册 on the App Store
  9. 保密相册计算机,‎加密相册(新版) - 密码计算机照片保险箱 im App Store
  10. springboot基于javaweb校园防疫管理系统毕业设计源码021043