模拟 co.js 的实现原理 (koa中间件的实现)
2017-08-11 11:09
555 查看
标签(空格分隔): co generator promise js
如何实现 co.js 核心的generator?
co 是什么?
co 是实现 koa 中间件的核心技术,中间件的 generator 都是由 co 来实现;
koa().use(function *(){ yield .... })
为什么要做这个demo呢?
可以学习该模块来清楚了解 koa 中间件的实现过程;源码也很简短,未压缩版本的 co.js 也才 242 行代码;
怎么做?
如何调试查看 co.js 实现过程?如何实现 co.js 核心的generator?
自己模拟实现的demo 代码
co.js 实现
//co.js 如何用的? var co_result = co(function *(){ return yield Promise.resolve('hehe') }) co_result.then((d)=>{console.log(d)}) // 结果: hehe
自己的代码实现
// 仿 co.js 源码 function self_g(fn){ return new Promise(function(resolve,reject){ resolve(fn().next().value) // 因为传进来的 fn 必然是一个 生成器 }) } //使用 var a = self_g(function *(){ return yield Promise.resolve('hehe') }) // 调试 a.then((d)=>{console.log(d)}) // 结果:hehe
所有内容完成,后面的内容是记录过程
1.如何调试 co.js
在 html 页面里引入 co.js 后,写入一个简单的函数,打断点
var co_result = co(function *(){ return yield Promise.resolve(true) // 断点处 })
实现过程记录
// co.js 源码 var co_result = co(function *(){ return yield Promise.resolve('hehe') }) co_result.then((d)=>{console.log(d)}) // 结果: hehe // 自己封装的: function self_g(fn){ return new Promise(function(resolve,reject){ resolve(fn().next()) }) } var a = self_g(function *(){ return yield Promise.resolve('hehe') }) a.then((d)=>{console.log(d)}) // {value: Promise, done: false} ==> 是一个 generator /* 打印出来的结果是一个 generator ,与预期的 co结果不一样 继续优化, 把 resolve 的结果变成 generator 的v alue 值就ok了 */ function self_g(fn){ return new Promise(function(resolve,reject){ resolve(fn().next().value) // 因为传进来的 fn 必然是一个 生成器 }) } var a = self_g(function *(){ return yield Promise.resolve('hehe') }) a.then((d)=>{console.log(d)}) // hehe (打印的结果和 co 是一模一样的)
相关文章推荐
- vue.js双向数据绑定原理解析及模拟demo的实现
- js模拟map实现原理终极版
- spring IOC 实现原理模拟实现
- Laravel中间件实现原理详解
- JS倒计时原理及实现
- Atitit。Tree文件解析器的原理流程与设计实现 java c# php js
- 详解js图片轮播效果实现原理
- 纯js实现遮罩层效果原理分析
- Vue.js双向绑定的实现原理
- DWR实现模拟Google搜索效果实现原理及代码
- Nuxt.js实现校验访问浏览器类型的中间件
- jQuery的实现原理的模拟代码 -1 核心部分
- 数据库shard中间件对比,以及sharding-jdbc 实现原理分析
- js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
- 在类有成员变量的场景下, 按照虚表原理, 模拟虚函数实现
- jQuery的实现原理的模拟代码 -3 事件处理
- java普通类模拟枚举实现原理
- JS连续滚动幻灯片:原理与实现
- 【JS】星级评分原理和实现( 下集第2章 第四种实现方式 )
- JS模拟实现ECMAScript5新增的数组方法