generator探幽(1)--koa中间件机制浅析
本系列旨在通过对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
不熟悉generator
和iterator
的小伙伴可以先看下阮一峰先生编写的《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
其实在koa
中yeild next
和yeild *next
效果是等价的,这主要得益于co库,我们以后再来好好扯扯这小玩意~
generator探幽(1)--koa中间件机制浅析相关推荐
- koa中间件机制详解
转自:https://cnodejs.org/topic/58fd8ec7523b9d0956dad945 koa是由express原班人马打造的一个更小.更富有表现力.更健壮的web框架. 在我眼中 ...
- 深入理解 Koa 中间件之 “ 洋葱模型 ”
欢迎关注我的公众号『 前端我废了 』,查看更多文章!!! 前言 我们知道创建一个 Koa 应用主要分三步: const Koa = require('koa'); // 1. 创建一个 Koa 实例 ...
- 初识洋葱模型,分析中间件执行过程,浅析koa中间件源码
前言 作为洋葱模型的第一篇文章,这里仅介绍了一些入门级知识,比如 了解洋葱模型执行顺序 分析部分 koa 中间件的源码来加深对中间件的认识 为第二篇文章:分析洋葱模型实现原理,在自己项目中接入洋葱模型 ...
- koa - 洋葱模型浅析
1.什么是koa? Koa是一个精简的node框架,被认为是第二代Node框架,其最大的特点就是独特的中间件流程控制,是一个典型的洋葱模型,它的核心工作包括下面两个方面: 将node原生的req和re ...
- koa2 一网打尽(基本使用,洋葱圈,中间件机制和模拟,源码分析,核心点,生态)
原文https://juejin.im/entry/5bfbe5a76fb9a049cb186cfa/detail koa homepage 优秀的下一代 web 开发框架. Koa 应用程序不是 H ...
- koa 接口返回数据_一文搞定 Koa 中间件实现原理
Koa是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小.更富有表现力.更健壮的基石. 通过利用 async 函数, Koa ...
- 从源码理解Redux和Koa2的中间件机制
Redux和Koa的中间件机制相关源码都很精简. 正文我将直接引用部分源码,并加以注释来帮助我们更清晰的理解中间件机制. Reudx redux的中间件机制在源码中主要涉及两个模块 内部的compos ...
- Koa 中间件的执行
Node.js 中请求的处理 讨论 Koa 中间件前,先看原生 Node.js 中是如何创建 server 和处理请求的. node_server.js const http = require(&q ...
- 【nodejs原理源码赏析(2)】KOA中间件的基本运作原理
[摘要] KOA中间件的基本运作原理 示例代码托管在:http://www.github.com/dashnowords/blogs 在中间件系统的实现上,KOA中间件通过async/await来在不 ...
最新文章
- python贪吃蛇控制台_如何用Python写一个贪吃蛇AI
- FB 宕机,Telegram 用户疯涨,P**hub 流量猛增
- Python中的字符串定义
- oracle 942错误(exp imp 出问题的解决方案)
- 为IoT应用搭建DevOps管道
- 让你提前认识软件开发(40):既要写好代码,又要写好文档
- Linux rpm 命令参数使用详解[介绍和应用](转)
- PS:教会你改【背景图颜色】
- 一起学ORBSLAM2(9)ORBSLAM的PNP解决方案
- C语言基础练习100--008(输出国际象棋棋盘)
- C语言-书籍资料汇总
- 奖学金设计mysql_数据库设计-奖学金评定系统.doc
- R语言之 as.formula()
- 防治脖子痛的简易保健操
- Photoshop学习心得
- 图片怎样调整分辨率?如何在线修改分辨率?
- excel删除重复的行
- a-table的数据内容特定处换行处理
- 图像处理职位面试题汇总(1)
- 笔记本硬件有linux驱动吗,为什么大多数的笔记本没有linux的驱动