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. SpringCloud架构设计

    最近一直在针对SpringCloud框架做项目,从中踩了不少的坑,也渐渐梳理出了一些内容,由于SpringCloud作为一个全家桶,其中东西太多,所以这时候就要有所取舍,这里就想把自己比较常用组件及架 ...

  2. 【UVa】Jump(dp)

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  3. python入门(八):连接mysql和STMP

    Python3 MySQL 数据库连接,使用 PyMySQL 连接数据库,并实现简单的增删改查.  mysql连接步骤 1.打开数据库连接 2.使用cursor()方法获取操作游标 3.执行sql和异 ...

  4. Hadoop1.2.1 配置文件详解

    首先我们先回顾一下Hadoop的一些概念: Apache Hdoop 1.x 组成 NameNode(元数据服务器) Secondary NameNode(辅助元数据服务器) JobTracker(任 ...

  5. Text Particle Systems

    一.简介 在一些企业广告或者网站需要一些动态文字特效的时候,往往有下面这几种选择: 1.Flash制作的文字特效 2.制作一个动态的GIF 3.Javascript+dom+css 4.SVG 二.j ...

  6. 面试题思考:Java RMI与RPC,JMS的比较

    RPC:(Remote Procedure Call)  被设计为在应用程序间通信的平台中立的方式,它不理会操作系统之间以及语言之间的差异. 支持多语言 RMI:(Remote Method Invo ...

  7. ios常用第三方库git下载地址

    本文转载至 http://blog.csdn.net/cerastes/article/details/38348599 iOS第三方库下载常用git 1.FMDB https://github.co ...

  8. Fiddler实现手机抓包——小白入门 - 做一个不动声色的大人

    手机用fiddler抓包 电脑最好是笔记本,这样能和手机保持统一局域网内:其他不多说,直接说步骤了. 一.对PC(笔记本)参数进行配置    1. 配置fiddler允许监听到https(fiddle ...

  9. Windows下IPython安装

    1:安装Python, 下载后安装即可:https://www.python.org/downloads/windows/,(选择Python2或Python3) 添加Path环境变量 2:安装ez_ ...

  10. 微信开发 获取用户openId 与路由控制

    w实践,满足当前需求. www.w.com www.w.com/w1.php $wxurl='https://open.weixin.qq.com/connect/oauth2/authorize?a ...