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函数的所有步骤

co.js异步回调原理理解的更多相关文章

  1. C“中断” 与 JS“异步回调” 横向对比

    在底层C语言中,有一个非常重要而特别的概念,叫做“中断”.用比喻来说,我正在写着博客,突然我妈打个电话过来,我就离开了键盘去接电话了,然后写博客就中断了,我聊完电话回来再继续写.乍一听似乎并没有什么大 ...

  2. js异步回调Async/Await与Promise区别 新学习使用Async/Await

    Promise,我们了解到promise是ES6为解决异步回调而生,避免出现这种回调地狱,那么为何又需要Async/Await呢?你是不是和我一样对Async/Await感兴趣以及想知道如何使用,下面 ...

  3. js异步队列之理解

    起因 最近看到一篇关于js异步执行顺序的解答,觉得有所收获,遂记录下来. marcotask和microtask js中异步队列可以分为两类,marcotask队列和microtask队列, marc ...

  4. Node.js异步IO原理剖析

    为什么要异步I/O? 从用户体验角度讲,异步IO可以消除UI阻塞,快速响应资源 JavaScript是单线程的,它与UI渲染共用一个线程.所以在JavaScript执行的时候,UI渲染将处于停顿的状态 ...

  5. js异步执行原理

    我们都知道js是一个单线程的语言,所以没办法同时执行俩个进程.所以我们就会用到异步. 异步的形式有哪些那,es5的回调函数.es6的promis等 异步的运行原理我们可以先看下面这段代码 应该很多人都 ...

  6. Node.js机制及原理理解初步【转】

    一.node.js优缺点 node.js是单线程. 好处就是 1)简单 2)高性能,避免了频繁的线程切换开销 3)占用资源小,因为是单线程,在大负荷情况下,对内存占用仍然很低 3)线程安全,没有加锁. ...

  7. js异步回调

    简单理解:js是单线程的,Ajax请求远程数据.IO等会很耗时,引起堵塞可能会引起反应时间太长页面失去反应. 回调:A函数作为一个参数传给B函数,执行完B后再执行A: 同步回调: function A ...

  8. Node.js机制及原理理解初步

    http://blog.csdn.net/leftfist/article/details/41891407 一.node.js优缺点 node.js是单线程. 好处就是 1)简单 2)高性能,避免了 ...

  9. 利用Generator解决异步回调原理

    var i = 0; i++; function ajax(url){ return new Promise(function(resolve, reject){ setTimeout(functio ...

随机推荐

  1. android之SQLite数据库insert操作

    原型: long Android.database.sqlite.SQLiteDatabase.insert(String table, String nullColumnHack, ContentV ...

  2. 第二百七十八节,MySQL数据库-表内容操作

    MySQL数据库-表内容操作 1.表内容增加 insert into 表 (列名,列名...) values (值,值,值...); 添加表内容添加一条数据 insert into 表 (列名,列名. ...

  3. WinDbg 解决Font.ToLogFont AccessViolationExcetion

    有个程序总是在windows 2003 server 异常退出. 并且,  查看调用栈也肯奇怪, 应该是很正常的调用. 怀疑是堆溢出. 开启heap trace : C:\Program Files\ ...

  4. hdu 4240在(最大流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4240 思路:题意真的有点难理解:在城市A->B之间通过所有路径一小时之内能通过最大的车辆(Max ...

  5. C#中Uri类的解释

    URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源.而URL是uniform resource locator,统一资源定位器,它是一种具体的UR ...

  6. Js 的几种去重(一维)

    写的几种数组去重方法: 第一种: [利用排序方法,然后比较当前元素与下一个元素是否相等] function repeat1(arr) { var length = arr.length; var re ...

  7. Lumen Carbon 日期及时间处理包

    用到过的方法: 获取当前Y-m-d H:i:s Carbon::now()->toDateTimeString() 把 Y-m-d H:i:s 转 Y-m-d Carbon::parse('Y- ...

  8. ArcGIS 同一要素图层合并

  9. shell脚本学习总结03--别名的使用

    1.创建别名 $ alias dms='cd Oracle/Middleware/user_projects/domains/7001_costctl/' $ dms $ dms $ pwd /hom ...

  10. php实现简单的权限管理

    今天主要来实现一个权限管理系统,它主要是为了给不同的用户设定不同的权限,从而实现不同权限的用户登录之后使用的功能不一样,首先先看下数据库 总共有5张表,qx_user,qx_rules和qx_jues ...