koa中间件执行流程

koa中间件的的执行顺序是洋葱模型,外层逐步向内,执行到最中间再逐步向外扩展,实现这个顺序的模型需要依赖于generator函数,它可以暂停执行将控制权交出,等到执行next再得到执行权继续执行,我们需要做的就是将generator串联起来,将后面的generator函数跟在上一层函数的yield语句之后,可以看作后面的函数是next的参数,这样我们就形成了一个串联,它的执行顺序就是我们前面所提到的洋葱模型。

koa-compose

在koa中,实现上面所说的串联函数就是利用了compose,下面是compose的大概实现(在koa中叫koa-compose):

function compose (middlewares) {return function (next) {var i = middlewears.length;var next = function* () {}();while (i--) {next = middlewares[i].call(this, next); <!--这一点不太好理解:首先这是个递减的过程,我们会先取到最后的一个函数然后,next函数其实是起到一个中介的作用,将next传入后又重新更新了next也就是在下一此的运行中next函数是带有刚刚那个最内层的函数的(最后一个)于是再进行操作,是一个递归传入的过程,可以看这篇文章:https://cnodejs.org/topic/5723360e35af8a704195f5d5-->}return next;}
}    

在koa的源码中有这样的代码:

var fn = this.experimntal? compose_es7(this.middleware): co.wrap(compose(this.middleware));

我们添加中间件的时候使用app.use方法,其实这个方法只是把中间件push到一个数组,很明显,所有的中间件在数组中,那么它们之间是没有联系的,所以我们会看到上面的代码,将所有的中间件都传入了我们所说的compose中。经过compose转换的代码是下面这样

//达到了洋葱模型的效果
function *() {yield *g1(g2(g3()))
}

co模块

上面我们看到通过使用koa-compose将中间件联系在一起(串联),可是在koa中需要调用next()方法才可以驱动函数向下执行。这时候就需要用到co模块。它可以帮我们自动管理generator的next,并根据调用返回value做出不同的响应;如果遇到另外一个generator,co会继续调用自己,这就是我们为什么需要co。
简单实现原理:

function run (gen) {var g;if (typeof gen.next === 'function') {g = gen;} else {g = gen();}function next () {var tmp = g.next();if (tmp.done) {return;} else if (typeof g.next === 'function') {run(tmp.value);  // 将下一步传入run函数当中next();}} next();
}

通过递归的方式(判断是否执行结束),来驱动generator的执行。

关于co模块的补充(es6)
  • co会返回一个Promise对象,因此我们可以使用then方法添加回调函数
  • co真正的源码做了什么
    • 检查当前代码是否为Generator函数的最后一步,如果是就返回
    • 确保每一步返回的结果都是promise对象
    • 使用then方法为返回值加上回调函数,然后通过onFulfilled函数再次调用next函数
    • 在参数不符合要求的情况下将promise状态改为Rejected从而终止模块。

ps:理解有限,如果有误请指出!

转载于:https://www.cnblogs.com/nanshanlaoyao/p/6686568.html

koa-中间件流程控制相关推荐

  1. web前端技术分享:koa中间件是如何实现的?

    在前端开发过程中我们可能会使用到koa中间件,但很多同学却不知道它是如何实现的,下面小千就来给大家介绍一下这个koa中间件(洋葱模型). 一.问题分析 async await是promise的语法糖, ...

  2. Koa 中间件的执行

    Node.js 中请求的处理 讨论 Koa 中间件前,先看原生 Node.js 中是如何创建 server 和处理请求的. node_server.js const http = require(&q ...

  3. 某大型银行深化系统技术方案之八:核心层之异步流程控制机制

    传送门☞Android兵器谱☞转载请注明☞http://blog.csdn.net/leverage_1229 核心层 核心层主要提供后台业务集中处理中最基本.共性的信息处理.流程调度和相关的管理功能 ...

  4. Koa 中间件使用之 koa-jwt

    Koa 中间件使用之 koa-jwt koa-jwt 是 koa 的一个验证 JSON Web Tokens 的中间件, 它可以将浏览器携带在请求里面的 token 获取出来进行验证, 并将验证之后的 ...

  5. [JavaScript] JavaScript 运算符与流程控制

    本文主要介绍switch,do-while,for-in,for-of的使用方法. 有关if-else,for,while等简单流程控制,和别的语言相似且常见,我没有自己写,本文将展示教程配套课件中的 ...

  6. Python学习笔记3 流程控制、迭代器、生成器

    第3章 流程控制.迭代器.生成器 3.1 选择语句 1.语法:(1)if -else (2)if-elif-else 2.注意:(1)每个条件后面要使用冒号:(2)使用缩进划分语句块(3)python ...

  7. python如何控制程序的运行顺序_Python流程控制-1 顺序执行

    流程控制指的是代码运行逻辑.分支走向.循环控制,是真正体现我们程序执行顺序的操作.流程控制一般分为顺序执行.条件判断和循环控制. 顺序执行 Python代码在执行过程中,遵循下面的基本原则: 普通语句 ...

  8. Python黑帽编程2.4 流程控制

    Python黑帽编程2.4  流程控制 本节要介绍的是Python编程中和流程控制有关的关键字和相关内容. 2.4.1 if -..else 先上一段代码: #!/usr/bin/python # - ...

  9. Java程序流程控制(顺序结构、分支结构、循环结构、if-else、switch-case、for、while、do-while、break、continue、return)

    流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块. 其流程控制方式采用结构化程序设计中规定的三种基本流程结构,即:         顺序结构         ...

最新文章

  1. 第10章:Shell基础
  2. PHP的is_numeric is_int is_integer ctype_digit
  3. 如何在 C# 中使用 委托
  4. linux单点登录命令,配置RHEV中LINUX 虚拟机使用ACTIVE DIRECTORY(AD域)实现单点登录的方法...
  5. 3年开发经验,挂在了MyBatis十八连环问上!精通MyBatis源码,有多吃香?
  6. mysql用编号查询密码,【mysql中退出当前数据库】
  7. 中学计算机教学叙事范文,初中地理教育叙事范文
  8. vscode-icons插件使用
  9. 【分享】regsvr32 不是内部或外部命令,也不是可运行的程序或批处理文件
  10. 程序员,活得是本事:30 岁后的 20 条人生建议
  11. Idea使用SVN教程
  12. 混淆矩阵(Confusion Matrix)
  13. 高性能的计算机至少有几个cpu,感觉PC对CPU的性能需求快到极限了
  14. Wifi认证及加密详解
  15. Spring 读取properties文件key+value方式
  16. jlh吃水果(C++)
  17. 学习java可以做什么?
  18. 笔记本电脑显示以太网未连接_如何向笔记本电脑添加以太网连接
  19. AI智能写作将改变文学创作的未来?
  20. 计算机读取数据的接囗教程,八爪鱼采集怎样获取数据API链接 八爪鱼采集获取数据API链接的方法...

热门文章

  1. python爬虫入门实例-Python-入门的第一个爬虫例子
  2. python对象编程例子-Python3.5面向对象编程图文与实例详解
  3. 从零开始学python网络爬虫-从零开始学Python 三(网络爬虫)
  4. python装饰器原理-Python装饰器的实现原理
  5. python代码示例下载-Python下载网易云歌单歌曲的示例代码
  6. python爬虫吧-Python爬虫——抓取贴吧帖子
  7. python编写的软件界面-为Python程序添加图形化界面的教程
  8. python之禅中文-Python之禅与翻译之美
  9. python基础教程是什么语言-终于懂得python中文入门教程
  10. 用python画玫瑰花教程-使用Python画一朵玫瑰花