co.js是基于es6的generator实现的,相当于generator函数的一个自动执行器

generator的简单介绍

function* fn(){
before()
yield firstYield()
yield secYield()
end()
} let gen = fn()//生成构造器
gen.next()//执行到第一个yield的位置,即只执行before(),firstYield()
gen.next()//执行到第二个yield的位置,只执行secYield()
gen.next()//执行直到结束,执行end()

  co.js的实现

将一个异步函数thunk化

原函数

fs.readFile(path,callback)

thunk化后函数

let readFile = (path) => (callback) => fs.readFile(path, callback)

将readFile的异步执行generator函数传入co

co(function* (){
let data1 = yield readFile('path1')
console.log(data1)//显示path1的文件的内容
let data2 = yield readFile('path2')
console.log(data2)//显示path2的文件内容
})

分析 co 函数

let co = (fn) => {
let gen = fn()//将gen指向generator构造器
let next = (err, data) => {
/**next函数,作用1.将上一步回调函数中data穿会给gen时期能为其他变量赋值,作用2:将gen向下一步运行,作用3.将next函数当成回调函数传给gen的某一步,使其将data传回next并执行下一步**/
let result = gen.next(data)
if(! result.done){
result.value(next)
}
}
next()
}

分析执行过程

1.co(……)

  执行let gen = fn   (相当于gen =function* (){

                     let data1 = yield readFile('path1')
                  console.log(data1)//显示path1的文件的内容
                  let data2 = yield readFile('path2')
                  console.log(data2)//显示path2的文件内容
                   })
2.next()
  执行let result = gen.next() (
      相当于 let result = {done: false, value: readFile('path1')
} (
          相当于 let result = { done: false, value: (callback) => fs.readFile(‘path1’, callback)}
        )
      )
  执行 if(! result.done ) //true||false
  执行 result.value(next) (
    相当于 ((callback) => fs.readFile('path1',callback))(next) (
      相当于 fs.readFile('path1', next)
    )
  )
3. 当文件读取完毕之后,调用 fs.readFile()执行回调函数next(err,data)返回第二步 4.执行完毕,执行完generator函数的所有步骤

最新文章

  1. 自制Azure中国版“加血包”
  2. 如何用Excel直接查询Oracle中的数据
  3. linux 内存清理/释放命令
  4. BZOJ1766 : [Ceoi2009]photo
  5. thttpd增加gzip压缩响应报文体功能,以减少传输数据量
  6. 指针二次释放(_BLOCK_TYPE_IS_VALID)
  7. Fresco好案例
  8. Vector示例一,二
  9. 【BZOJ 1090】[SCOI2003]字符串折叠
  10. Android中的一些基础知识(二)
  11. spring mvc 存取值
  12. applicationContext.xml最基本配置文件
  13. react中的DOM操作
  14. Playground中格式注释语法
  15. c#学习笔记 day_one
  16. vertx的Future设计
  17. 在Linux系统上安装Oracle数据库
  18. Wiener Filter
  19. hue中使用oozie的workflow执行mr
  20. Unity3D Animator控制参数和添加事件

热门文章

  1. Http缺省的请求方法是。(选择1项)
  2. serv-u ftp服务器搭建
  3. splash启动速度优化
  4. Py3+PyQt5+Eric6:学习记录之第一天:点击按钮获取文本框的值并输出。
  5. a标签点击后,给a标签添加样式
  6. js控制radio选中
  7. Linux命令之乐--rename
  8. Android之检查网络是否可用(跳转网络设置页面)
  9. 40 个顶级 jQuery 图片、内容滑块和幻灯片
  10. 【BZOJ3211】花神游历各国 并查集+树状数组