本系列旨在通过对co,koa等库源码的研究,进而理解generator在异步编程中的重大作用(ps:所有代码请在node --harmony或者iojs环境中运行)

koa中间件的形式

相信用过koa的小伙伴一定很熟悉下面这段代码

var app = require('koa')(),router = require('koa-router')();app.use(function *(next){console.log(1);yield next;console.log(5);
});
app.use(function *(next){console.log(2);yield next;console.log(4);
});
app.use(function *(){console.log(3);
});app.listen(3000);

当一个请求到达的时候,控制台会依次输出1 2 3 4 5,这就是koa中强大的middleware特性,撇开koa本身,我们来扯扯middleware这东西是怎么实现的

yield *iterator

不熟悉generatoriterator的小伙伴可以先看下阮一峰先生编写的《ES6入门》的generator函数这一节
假设你已经熟悉了generator和iterator,现在我们来看一段代码

function *m1(){console.log(1);yield *m2Iterator;console.log(3);
}function *m2(){console.log(2);
}
var m1Iterator = m1(),m2Iterator = m2();m1Iterator.next();//

上面代码运行后,控制台会依次输出1 2 3,这是因为在m1函数内部,yield后面跟的是一个iterator
m1Iterator.next()调用后,m1函数开始执行。
m1运行到yield *m2Iterator时,不会暂停,而是直接跳进m2函数执行m2函数内的代码。
由于m2函数中没有yield,因此会一直执行完m2函数中的代码,并返回至m1函数中执行yield *m2Iterator后面的代码。

middleware中间件的雏形

理解了上面的过程后,我们接着看下面这段代码

function *m1(){console.log(1);yield *m2();console.log(5);
}function *m2(){console.log(2);yield *m3();console.log(4);
}function *m3(){console.log(3);
}m1().next(); //控制台依次输出1 2 3 4 5

是不是形式跟我们一开始看到的koa的中间件有点接近了?

compose

compose是koa里用来实现中间件机制的模块
compose函数最关键的一段代码

while(i--){next = middleware[i].call(this, next);
}
yield *next;

这段代码把middleware中传进来的generator数组逆序取出并依次执行,每次执行的时候把上次generator执行返回的iterator当作参数传进去,所有generator执行完之后,调用第一个iterator
因此,在generator中间件函数中,其实yield后面跟的是个iterator,即yield *next
下面用一个例子来说明这个过程

function *m1(next){console.log(1);yield *next;console.log(5);
}function *m2(next){console.log(2);yield *next;console.log(4);
}function *m3(){console.log(3);
}var gen = compose([m1, m2, m3]),it = gen();
//compose([m1, m2, m3])()可以想象成它做了这么一些事(伪代码):
//1 var it3 = m3();
//2 var it2 = m2(it3);
//3 var it1 = m1(it2);
//4 gen = function(){
//          yield *it1;
//        }it.next(); //控制台依次输出1 2 3 4 5

现在就很像koa的中间件的写法了。唯一的差别是koa中使用的是yeild next而我们这里用的是yield *next
其实在koayeild nextyeild *next效果是等价的,这主要得益于co库,我们以后再来好好扯扯这小玩意~

generator探幽(1)--koa中间件机制浅析相关推荐

  1. koa中间件机制详解

    转自:https://cnodejs.org/topic/58fd8ec7523b9d0956dad945 koa是由express原班人马打造的一个更小.更富有表现力.更健壮的web框架. 在我眼中 ...

  2. 深入理解 Koa 中间件之 “ 洋葱模型 ”

    欢迎关注我的公众号『 前端我废了 』,查看更多文章!!! 前言 我们知道创建一个 Koa 应用主要分三步: const Koa = require('koa'); // 1. 创建一个 Koa 实例 ...

  3. 初识洋葱模型,分析中间件执行过程,浅析koa中间件源码

    前言 作为洋葱模型的第一篇文章,这里仅介绍了一些入门级知识,比如 了解洋葱模型执行顺序 分析部分 koa 中间件的源码来加深对中间件的认识 为第二篇文章:分析洋葱模型实现原理,在自己项目中接入洋葱模型 ...

  4. koa - 洋葱模型浅析

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

  5. koa2 一网打尽(基本使用,洋葱圈,中间件机制和模拟,源码分析,核心点,生态)

    原文https://juejin.im/entry/5bfbe5a76fb9a049cb186cfa/detail koa homepage 优秀的下一代 web 开发框架. Koa 应用程序不是 H ...

  6. koa 接口返回数据_一文搞定 Koa 中间件实现原理

    Koa是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小.更富有表现力.更健壮的基石. 通过利用 async 函数, Koa ...

  7. 从源码理解Redux和Koa2的中间件机制

    Redux和Koa的中间件机制相关源码都很精简. 正文我将直接引用部分源码,并加以注释来帮助我们更清晰的理解中间件机制. Reudx redux的中间件机制在源码中主要涉及两个模块 内部的compos ...

  8. Koa 中间件的执行

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

  9. 【nodejs原理源码赏析(2)】KOA中间件的基本运作原理

    [摘要] KOA中间件的基本运作原理 示例代码托管在:http://www.github.com/dashnowords/blogs 在中间件系统的实现上,KOA中间件通过async/await来在不 ...

最新文章

  1. python贪吃蛇控制台_如何用Python写一个贪吃蛇AI
  2. FB 宕机,Telegram 用户疯涨,P**hub 流量猛增
  3. Python中的字符串定义
  4. oracle 942错误(exp imp 出问题的解决方案)
  5. 为IoT应用搭建DevOps管道
  6. 让你提前认识软件开发(40):既要写好代码,又要写好文档
  7. Linux rpm 命令参数使用详解[介绍和应用](转)
  8. PS:教会你改【背景图颜色】
  9. 一起学ORBSLAM2(9)ORBSLAM的PNP解决方案
  10. C语言基础练习100--008(输出国际象棋棋盘)
  11. C语言-书籍资料汇总
  12. 奖学金设计mysql_数据库设计-奖学金评定系统.doc
  13. R语言之 as.formula()
  14. 防治脖子痛的简易保健操
  15. Photoshop学习心得
  16. 图片怎样调整分辨率?如何在线修改分辨率?
  17. excel删除重复的行
  18. a-table的数据内容特定处换行处理
  19. 图像处理职位面试题汇总(1)
  20. 笔记本硬件有linux驱动吗,为什么大多数的笔记本没有linux的驱动

热门文章

  1. php不能显示验证码
  2. phpmyadmin设置登录密码的几种方法
  3. Windows Phone 7中用好Silverlig“.NET研究”ht开发利器
  4. winform datagridview 提高性能。
  5. Redis数据库操作指令
  6. MySQL服务的启动与停止-使用命令行工具
  7. 运行过程中的leader选举
  8. BeanFactory作为 IoC 容器示例
  9. Redis中的Lua 脚本
  10. FastDFS整合SpringBoot - 实现service