模拟 co.js 的实现原理 (koa中间件的实现)
来源:互联网 发布:sql增加数据 编辑:程序博客网 时间:2024/06/05 05:29
标签(空格分隔): co generator promise js
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 是一模一样的)
阅读全文
0 0
- 模拟 co.js 的实现原理 (koa中间件的实现)
- Koa中间件方式实现API的Undo功能
- 中间件的实现原理
- Koa中间件(middleware)实现探索
- co模块的实现原理的理解
- Co-实现原理分析
- nodejs-koa框架的中间件级联
- koa中间件原理 && yield && generator
- node.js的koa框架
- Laravel中间件实现原理
- Laravel中间件实现原理
- (Ryan的Koa系列博客)1.说说Koa用到的JS基础知识
- Koa框架实践与中间件原理剖析
- Koa框架实践与中间件原理剖析
- 模拟hibernateTemplete的内部源代码实现原理
- 简单模拟hibernate的实现原理
- js模拟实现Array的sort方法
- js实现的模拟form提交数据
- WPF 为PasswordBox控件的Password增加绑定功能
- maven配置环境
- 高德地图vs百度地图
- 更换jdk版本:jdk1.8更换为jdk1.7之后输入java -version还是出现1.8的版本号
- iOS UINavigationController
- 模拟 co.js 的实现原理 (koa中间件的实现)
- 翻译QT基于TCP聊天室server
- gulp+jsp初探
- [数据库与SQL]
- The order of a Tree HDU
- 路径压缩 递归 与非递归版本
- 007 UseGCLogFileRotation NumberOfGCLogFiles GCLogFileSize
- C#中bin与obj
- AIDL使用入门, 客户端通过AIDL与服务端通信