模拟 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 是一模一样的)
原创粉丝点击