您的位置:首页 > Web前端 > JavaScript

模拟 co.js 的实现原理 (koa中间件的实现)

2017-08-11 11:09 555 查看
标签(空格分隔): 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 是一模一样的)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: