尽管koa2中已经被async/await代替。但我还是想自个儿着写一个koa1中的generator。

一,

写这个之前,先写一个可以现实,express中next用法的函数:

  1. var event=require('events').EventEmitter;
  2. class App extends event{
  3. constructor(){
  4. super();
  5. this.arr=[],this.i=0;
  6. this.on('next',data=>{
  7. let node=this.arr[++this.i];
  8. if (!node) return ;
  9. node(this.next);
  10. })
  11. }
  12. next(){
  13. this.emit('next');
  14. }
  15. use(v){
  16. this.arr.push(v);
  17. }
  18. end(){
  19. this.arr[this.i](this.next.bind(this));
  20. }
  21.  
  22. }

 使用:

  1. var myApp=new App();
  2. myApp.use(next=>{
  3. console.log('step1');
  4. next();
  5. })
  6.  
  7. myApp.use(next=>{
  8. console.log('step2');
  9. })
  10.  
  11. myApp.end();

二, 

 很成功。好了。下面写koa里的实现,就直接写function 了。这样写得快些 - -!。。:

  1. function App(){
  2. let arr=[],i=0;
  3. let self=this;
  4. let next=function(){
  5. if(!arr[++i]) return ;
  6. self.end();
  7. };
  8. this.use=function(fn){
  9. arr.push(fn);
  10. }
  11. this.end=function(){
  12. let g=arr[i](next);
  13. let run=function(){ //run函数执行这个generator;
  14. let result=g.next();
  15. if(result.done) return;
  16. result.value();
    run();
  17. }
  18. g?run():0;
  19. }
  20. }

  使用:

  1. var a=new App();
  2. a.use(function* (next){
  3. console.log('a1');
  4. yield next;
  5.  
  6. })
  7. a.use(function* (next){
  8. console.log('b1');
  9. yield next;
  10. console.log('b2');
  11. yield next;
  12. })
  13. a.use(function* (next){
  14. console.log('c1');
  15. yield next;
  16. })
  17. a.use(function(){
  18. console.log('c2')
  19. })
  20. a.use(function(){
  21. console.log('c3')
  22. })
  23.  
  24. a.end();

  返回结果:

a1;

b1;

c1;

c2;

b2;

c3;

好的这样大致框架就成功了。其余的可以慢慢进化。。

实现koa中的generator用法的更多相关文章

  1. JavaScript中的Generator函数

    1. 简介 Generator函数时ES6提供的一种异步编程解决方案.Generator语法行为和普通函数完全不同,我们可以把Generator理解为一个包含了多个内部状态的状态机. 执行Genera ...

  2. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  3. C#中string.format用法详解

    C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...

  4. SQL中distinct的用法

    SQL中distinct的用法   1.作用于单列 2.作用于多列 3.COUNT统计 4.distinct必须放在开头 5.其他 在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出 ...

  5. Oracle 中 decode 函数用法

    Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...

  6. jQuery中Animate进阶用法(一)

    jQuery中animate的用法你了解多少呢?如果仅仅是简单的移动位置,显示隐藏,哦!天哪你在浪费资源!因为animate太强大了,你可以有很多意想不到的用法!让我们一起研究一下吧~~ 首先要了解j ...

  7. [转载]js中return的用法

    一.返回控制与函数结果,语法为:return 表达式; 语句结束函数执行,返回调用函数,而且把表达式的值作为函数的结果 二.返回控制,无函数结果,语法为:return;  在大多数情况下,为事件处理函 ...

  8. js中this的用法

    经过近几周的模拟面试题,我查询了一些资料,今天就来说说,在js中this的用法吧.方法有四:第一,用作全局变量,第二,用作表该对象,第三,用作构造函数,第四,用作call和applay

  9. jQuery中eq()方法用法实例

    本文实例讲述了jQuery中eq()方法用法.分享给大家供大家参考.具体分析如下: 此方法能够获取匹配元素集上的相应位置索引的元素. 匹配元素集上元素的位置索引是从0开始的. 语法结构: 复制代码 代 ...

随机推荐

  1. JavaScript 中的this指向问题

    全局执行     首先,我们在全局环境中看看它的 this 是什么:     浏览器:     console.log(this);     // Window {speechSynthesis: S ...

  2. javascript实现页面右侧在线客服始终跟随鼠标滚动而上下滚动且始终位于屏幕中间

    效果如图,右侧的联系一栏始终位于页面的中间位置,且随着页面的上下滚动而滚动跟随 css的话没什么好说的,看图 代码 window.onload=window.onresize=window.onscr ...

  3. 第11章 使用PHP从Web访问MySQL数据库

    1.过滤用户可能值其搜索条件的起始或结束位置不小心输入的空白字符: 应用trim(): 2.转义数据(第4章)函数:addslashes(),stripslashes(),get_magic_quot ...

  4. 微信js-sdk调用

    之前在做微信的时候,在微信支付还有调起微信扫一扫的时候,用过js-sdk.最近,被几个做前端的同学问到了具体的流程,想想,还是写下来好点.     微信js-sdk,是微信提供给网页开发设计者使用的, ...

  5. (一)初步了解python

    python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承. Py ...

  6. 爬虫代码实现五:解析所有分页url并优化解析实现类

    如图,我们进入优酷首页,可以看到电视剧列表,我们称这个页面为电视剧列表页,而点击进入某个电视剧,则称为电视剧详情页.那么如何获取所有分页以及对应的详情页呢,通过下面的分页得到. 因此,首先,我们将St ...

  7. github上前100的ios项目

    1. AFNetworking    作者是 NSHipster 的博主, iOS 开发界的大神级人物, 毕业于卡内基·梅隆大学, 开源了许多牛逼的项目, 这个便是其中之一, AFNetworking ...

  8. Java常用术语及区别

    Java中总有几个术语,平时说的多,但是还是让人有点摸不着头脑,今天就来解析一下他们的区别: l JDK:Java development toolkit,是 Java 语言的软件开发工具包(SDK) ...

  9. github本地库及clone常用命令

    新建本地库 1. cd d: 2. mkdir git 3. cd git 4. git init 5. git remote add  origin git@github.com:swportal/ ...

  10. [linux]查看机器有几个cpu,是否支持64位

    1. 查看物理CPU的个数#cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l 2. 查看逻辑CPU的个数#cat /pr ...