博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
KOA中间件源码解析
阅读量:4349 次
发布时间:2019-06-07

本文共 1660 字,大约阅读时间需要 5 分钟。

告别回调噩梦,从这里开始

KOA中间件的执行顺序

请看下面来自官网的代码和执行顺序:

image

以上代码的实现如果用回调函数来实现,无疑是一场噩梦,而KOA却以十分优雅的方式实现了如下图洋葱图一般的回调:

image

实现原理

核心是利用ES6的新特性:generator

具体实现是利用KOA的两个NIUBI轰轰的模块:compose和CO

compose

compose模块,用于将所有generator中间件串联起来,基本上就是将后一个generator赋给前一个generator的next参数。也就是在yield后面调用下一个generate函数。

大致原理:

// 中间件 afunction* a(next) {  yield 1;  // 执行下一个中间件  yield* next;  yield '继续执行A中间件';}// 中间件 bfunction* b(next) {  yield 2;  yield 3;}var next = function* (){};var i = [a, b].length;// 通过next首尾相连while(i--) {  next = [a, b][i].call(null, next);}// 包裹第一个middlewarefunction* start(ne) {  return yield* ne;}// 输出console.log(start(next).next());console.log(start(next).next());console.log(start(next).next());console.log(start(next).next());输出结果:➜  a-lab ./a{ value: 1, done: false }{ value: 2, done: false }{ value: 3, done: false }{ value: '继续执行A中间件', done: false }

这里可以看出来:compose取中间件是做i-循环的,但是由于一开始是吧中间件推入栈中,顺序为FILO,所有顺序是没问题的。

但是:那个负责把所有中间件串起来的next其实本身也是一个generator,但是,如果在Generater函数内部,调用另一个Generator函数,默认情况下是没有效果的。

所以这时候就轮到我们的CO模块出场啦

CO

CO模块:CO模块便通过递归使得嵌套好的generate依次自动执行(包装为Promise对象)

大致源码实现

function run(gen){  var g;  if (typeof gen.next === 'function') {    g = gen;  } else {    g = gen();  }  function next(){    var tmp = g.next();    //如果tmp.done为true,那么证明generator执行结束,返回。if (tmp.done) {      return;    } elseif (typeof g.next === 'function') {      run(tmp.value);      next();    }  }  next();}
  • co帮我们"自动管理"generator的next,并根据调用返回的value做出不同的响应,这个响应是通过toPromise方法进行的
  • 如果遇到另外一个generator,co会继续调用自己,这就是为什么我们不需要写yield* next(使得next自执行)的原因,而只要写yield next
  • 而且CO模块会判断执行完所有的中间件,才会对res进行操作,所以在中间件中我们可以随意修改res,不会出现express中的路由已经终止请求-响应循环。

转载于:https://www.cnblogs.com/gaoxianlyx/p/6534217.html

你可能感兴趣的文章
【NOI2015】品酒大会
查看>>
内部类单例模式,
查看>>
opensuse13.1 安装 SqliteMan
查看>>
念初三生活
查看>>
zbb20180827 java获取html内容
查看>>
node处理get和post请求
查看>>
【JAVA集合详解】LinkedList
查看>>
面向 例题
查看>>
RSA加密
查看>>
HTML5游戏开发进阶指南
查看>>
ASP.NET GBK读取QueryString
查看>>
[LintCode] 159 Find Minimum in Rotated Sorted Array
查看>>
在reshard过程中,将会询问reshard多少slots:
查看>>
地精排序-最简单的排序算法
查看>>
跑路啦 跑路啦 这个博客废掉啦
查看>>
JQuery 实现返回顶部效果
查看>>
辛苦挣钱买房,结果房产证一直办不下来
查看>>
Which kind of aspects of OIL PRESS MACHINERY would you like best
查看>>
[转载] 晓说——第17期:揭秘战争秘闻 朝鲜战争62年祭(下)
查看>>
java集合系列之ArrayList源码分析
查看>>