实现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开始的. 语法结构: 复制代码 代 ...
随机推荐
- Hadoop基本命令详解
调用文件系统(FS)Shell命令应使用bin/hadoop fs <args>的形式.所有的的FS shell命令使用URI路径作为参数.URI路径详解点击这里. 1.cat 说明:将路 ...
- C语言中的位运算的技巧
一.位运算实例 1.用一个表达式,判断一个数X是否是2的N次方(2,4,8,16.....),不可用循环语句. X:2,4,8,16转化成二进制是10,100,1000,10000.如果减1则变成01 ...
- C# 3.0相比C# 2.0增加的功能
1.自动属性 (1)自动属性(Auto-Implemented Properties),C#自动属性可以避免原来我们手工的来声明一个私有成员变量以及和属性get,set的书写. public clas ...
- 面试题-Java基础-布局管理器
1.什么是布局管理器? 布局管理器用来在容器中组织组件.
- asp.net MVC漏油配置总结
URL构造 命名参数规范+匿名对象 routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}&qu ...
- svn用Cornerstone上传项目丢失静态库.a问题的解决
最近电脑重装系统后,装上Cornerstone上传项目后,发现又有丢失.a文件的问题,这里说一下解决办法,打开Preferences-->Subversion-->General,将Use ...
- TortoiseSVN 1.8 关于右键的设置
以前用SVN但都是 IDE 自己集成的插件,最近使用 android studio 发现居然自己不带SVN command line插件,非得自己单独装一个,于是使用了 TortoiseSVN ,但用 ...
- 回文质数 Prime Palindromes
题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围[a,b](5 <= a < b <= 100,000 ...
- 移动平台下的Socket几个问题
在页游时代,使用Flash ActionScript 3.0进行开发,as3提供比较简单和健全的socket API.到了手游时代,基于tcp的socket编程遇到了一些棘手的问题.通常情况下手游都要 ...
- jsp:useBean的使用
->Bean的基本要素: 1.必须要有一个不带参数的构造器,在jsp元素创建Bean时会调用空构造器 2.Bean类应该没有任何公共实例变量,也就是说,不允许直接访问实例变量,通过setter/ ...