实现koa中的generator用法
尽管koa2中已经被async/await代替。但我还是想自个儿着写一个koa1中的generator。
一,
写这个之前,先写一个可以现实,express中next用法的函数:
var event=require('events').EventEmitter;
class App extends event{
constructor(){
super();
this.arr=[],this.i=0;
this.on('next',data=>{
let node=this.arr[++this.i];
if (!node) return ;
node(this.next);
})
}
next(){
this.emit('next');
}
use(v){
this.arr.push(v);
}
end(){
this.arr[this.i](this.next.bind(this));
} }
使用:
var myApp=new App();
myApp.use(next=>{
console.log('step1');
next();
}) myApp.use(next=>{
console.log('step2');
}) myApp.end();
二,
很成功。好了。下面写koa里的实现,就直接写function 了。这样写得快些 - -!。。:
function App(){
let arr=[],i=0;
let self=this;
let next=function(){
if(!arr[++i]) return ;
self.end();
};
this.use=function(fn){
arr.push(fn);
}
this.end=function(){
let g=arr[i](next);
let run=function(){ //run函数执行这个generator;
let result=g.next();
if(result.done) return;
result.value();
run();
}
g?run():0;
}
}
使用:
var a=new App();
a.use(function* (next){
console.log('a1');
yield next; })
a.use(function* (next){
console.log('b1');
yield next;
console.log('b2');
yield next;
})
a.use(function* (next){
console.log('c1');
yield next;
})
a.use(function(){
console.log('c2')
})
a.use(function(){
console.log('c3')
}) a.end();
返回结果:
a1;
b1;
c1;
c2;
b2;
c3;
好的这样大致框架就成功了。其余的可以慢慢进化。。
实现koa中的generator用法的更多相关文章
- JavaScript中的Generator函数
1. 简介 Generator函数时ES6提供的一种异步编程解决方案.Generator语法行为和普通函数完全不同,我们可以把Generator理解为一个包含了多个内部状态的状态机. 执行Genera ...
- [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法
一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...
- C#中string.format用法详解
C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...
- SQL中distinct的用法
SQL中distinct的用法 1.作用于单列 2.作用于多列 3.COUNT统计 4.distinct必须放在开头 5.其他 在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出 ...
- Oracle 中 decode 函数用法
Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...
- jQuery中Animate进阶用法(一)
jQuery中animate的用法你了解多少呢?如果仅仅是简单的移动位置,显示隐藏,哦!天哪你在浪费资源!因为animate太强大了,你可以有很多意想不到的用法!让我们一起研究一下吧~~ 首先要了解j ...
- [转载]js中return的用法
一.返回控制与函数结果,语法为:return 表达式; 语句结束函数执行,返回调用函数,而且把表达式的值作为函数的结果 二.返回控制,无函数结果,语法为:return; 在大多数情况下,为事件处理函 ...
- js中this的用法
经过近几周的模拟面试题,我查询了一些资料,今天就来说说,在js中this的用法吧.方法有四:第一,用作全局变量,第二,用作表该对象,第三,用作构造函数,第四,用作call和applay
- jQuery中eq()方法用法实例
本文实例讲述了jQuery中eq()方法用法.分享给大家供大家参考.具体分析如下: 此方法能够获取匹配元素集上的相应位置索引的元素. 匹配元素集上元素的位置索引是从0开始的. 语法结构: 复制代码 代 ...
随机推荐
- ipc 入侵步骤
第一步:建立IPC隧道net use \\10.56.204.186\IPC$ "密码" /user:"用户" 第二步:映射对方c盘到本地z盘net u ...
- LocalDateTime返回的是Local时间
LocalDateTime返回的是本地时间,比如 LocalDateTime startDateTime = LocalDateTime.of(2016, 9, 18,00, 00); 返回的时间格式 ...
- html5 canvas的教程
原文地址:http://www.cnblogs.com/tim-li/archive/2012/08/06/2580252.html 原作很强悍 导航 前言 基本知识 绘制矩形 清除矩形区域 圆弧 路 ...
- css学习笔记1
:before,:after伪元素 伪元素特性(目前已经遇到的) 它不存在于文档中,所以js无法操作它 它属于主元素本身,有些伪类仅仅是代表元素内容的一部分,譬如:first-letter代表第一个字 ...
- JS判断在哪个浏览器打开
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- >> 计算机的数据表示
1. 采用二进制 2. 负数采用补码表示 3. 乘法处理 4. 浮点数
- SAP HANA学习资料大全[非常完善的学习资料汇总]
Check out this SDN blog if you plan to write HANA Certification exam http://scn.sap.com/community/ha ...
- http请求的概念
我曾多次阅读http协议,但是理解依然不深,在此,再次阅读,再次理解.加深两点:解析头部信息\r\n,分解头部和主体用\r\n\r\n.之所以一次请求会看到网络里有很多请求,是因为浏览器代替访问了多次 ...
- VR应用向导,全球Top10 VR应用排行榜
2016年国际知名产商索尼.三星.HTC.Oculus.YouTube等等都推出了自己的VR设备,与此同时还有自有的VR应用平台,供各位玩家下载应用体验沉浸式VR,当然每个平台的VR应用下载量各不相同 ...
- hadoop,yarn和vcpu资源配置
Hadoop YARN同时支持内存和CPU两种资源的调度(默认只支持内存,如果想进一步调度CPU,需要自己进行一些配置),本文将介绍YARN是如何对这些资源进行调度和隔离的. 在YARN中,资源管理 ...