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

转载于:https://www.cnblogs.com/ranjianxi/p/6808147.html

co.js异步回调原理理解相关推荐

  1. RPC-client异步回调原理

    RPC-client异步回调原理 见下面的设计图: 所谓异步回调,在得到结果之前,不会处于阻塞状态,理论上任何时间都没有任何线程处于阻塞状态,因此异步回调的模型,理论上只需要很少的工作线程与服务连接就 ...

  2. JS异步:执行原理与回调

    JS异步:执行原理与回调 一.JS异步的执行原理 二.JS异步中的回调 一.JS异步的执行原理   我们知道JavaScript是单线程的,而浏览器是多线程的.单线程执行任务需要一个个排队进行,假如一 ...

  3. 【Promise】入门-同步回调-异步回调-JS中的异常error处理-Promis的理解和使用-基本使用-链式调用-七个关键问题

    文章目录 1. 预备知识 1.1 实例对象与函数对象 1.2 两种类型的回调函数 1. 同步回调 2. 异步回调 1.3 JS中的异常error处理 1. 错误的类型 2. 错误处理(捕获与抛出) 3 ...

  4. python异步回调实现原理_JS基础——异步回调

    前言 一个刚入前端的小菜,虽然以前看到过关于回调的文章,但是呢,理解起来有点费劲啊.当时的脑海里就一个概念. 回调:大多出现在Ajax请求,用于处理收到的请求结果. 嘿嘿,当时真的就是这一个想法啊.现 ...

  5. Ajax的异步同步原理以及js几种方式的实现

    Ajax的异步同步原理以及js几种方式的实现的个人详细解析 Ajax简介 Ajax的全称是:Asynchronous JavaScript And XML,指的是异步 JavaScript 及 XML ...

  6. js同步异步 回调函数

    学js这么久 只知道它是一个单线程的语言,同步异步听了这么多从未深思过. 在写ajax请求时再一次看见回调函数,想到在网上去查查详细的知识,没想到查出一大堆讲同步异步的,看了不少人的文章,这才感觉自己 ...

  7. 关于js的回调函数,同步回调与异步回调

    回调定义 刚开始学习javascript时,对回调函数的理解仅仅停留在知道定义阶段.什么是回调函数? 就是将一个函数作为参数传递给另一个函数,作为参数的这个函数就是回调函数. 至于为什么要用到回调函数 ...

  8. JS 异步发展流程(回调函数=Async/await)

    异步编程的语法目标,就是怎样让它更像同步编程 什么是异步? 异步任务指的是,不进入主线程.而进入"任务队列"(task queue)的任务,只有"任务队列"通知 ...

  9. node.js 使用domain模块捕获异步回调中的异常

    和其他服务器端语言相比,貌似node.js 对于异常捕捉确实非常困难. 首先你会想到try/catch ,但是在使用过程中我们会发现并没有真正将错误控制在try/catch 语句中. 为什么? 答案是 ...

  10. Java接口回调,异步回调理解

    文章目录 前言 一.回调简单理解 二.Java中用接口实现回调 1.实现接口回调 1.1同步回调 1.2 异步回调 2.为啥要用接口实现 3.关于接口(基础) 总结 前言 本文是作者在学习接口回调时看 ...

最新文章

  1. 宜阳一高中历年录取分数线_上海高中TOP30!从录取分数线看上海高中排名!
  2. Intel Realsense 图像投影(Projection)翻译
  3. Adblock Plus cjxlist 规则说明与反馈贴
  4. Docker1.8在Centos7下的安装
  5. [转]cubemap soft shadow
  6. 鸿蒙分布式体验,一张图看懂鸿蒙OS 2.0 分布式能力升级构筑全场景体验
  7. android 控件覆盖关系,安卓子控件抢占父控件点击事件或者焦点问题
  8. gtone eclipse plugin install
  9. 珍藏40个android应用源码分享
  10. 华为电脑c盘哪些文件可以删除,c盘可以删除哪些文件
  11. python安装matplotlib绘图库
  12. window7系统搭建FTP服务端,使用FileZilla FTP客户端测试
  13. 2022年执法资格通用法律知识考试判断题专项训练题及答案
  14. 拼多多下单助手怎么一键采购、发货的?
  15. Nginx服务器读取不到文件的转换方法
  16. Linux:xinetd服务安装与配置(操作环境:Ubuntu 18.04)
  17. 解决导出CSV文件乱码的问题
  18. linux shell中实现循环日期和月份
  19. 工作之余找到生活的意义
  20. 【转】一个小公司老板的日常管理,希望能让创业的朋友学到东西

热门文章

  1. java进账和转账需要锁吗,Spring与Java中的锁
  2. 区块链 怎么设置区块最大交易容量
  3. ubuntu apt 卸载 golang
  4. Docker教程小白实操入门(12)--如何使用build指令根据Dockerfile文件构建一个镜像
  5. [thinkphp] page类整合bootstrap分页样式
  6. mpchart点击_MPAndroidChart实现K线面板(一)
  7. matlab 数字基带,基于MATLAB的数字基带传输的 FIR滤波器的设计
  8. mysql查询语句内连接、左连接、右连接以及全连接查询
  9. 动画效果之PC端 移动端 探照灯遮罩动画
  10. MySQL学习(一、概述和表的基本操作)