co.js异步回调原理理解
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异步回调原理理解相关推荐
- RPC-client异步回调原理
RPC-client异步回调原理 见下面的设计图: 所谓异步回调,在得到结果之前,不会处于阻塞状态,理论上任何时间都没有任何线程处于阻塞状态,因此异步回调的模型,理论上只需要很少的工作线程与服务连接就 ...
- JS异步:执行原理与回调
JS异步:执行原理与回调 一.JS异步的执行原理 二.JS异步中的回调 一.JS异步的执行原理 我们知道JavaScript是单线程的,而浏览器是多线程的.单线程执行任务需要一个个排队进行,假如一 ...
- 【Promise】入门-同步回调-异步回调-JS中的异常error处理-Promis的理解和使用-基本使用-链式调用-七个关键问题
文章目录 1. 预备知识 1.1 实例对象与函数对象 1.2 两种类型的回调函数 1. 同步回调 2. 异步回调 1.3 JS中的异常error处理 1. 错误的类型 2. 错误处理(捕获与抛出) 3 ...
- python异步回调实现原理_JS基础——异步回调
前言 一个刚入前端的小菜,虽然以前看到过关于回调的文章,但是呢,理解起来有点费劲啊.当时的脑海里就一个概念. 回调:大多出现在Ajax请求,用于处理收到的请求结果. 嘿嘿,当时真的就是这一个想法啊.现 ...
- Ajax的异步同步原理以及js几种方式的实现
Ajax的异步同步原理以及js几种方式的实现的个人详细解析 Ajax简介 Ajax的全称是:Asynchronous JavaScript And XML,指的是异步 JavaScript 及 XML ...
- js同步异步 回调函数
学js这么久 只知道它是一个单线程的语言,同步异步听了这么多从未深思过. 在写ajax请求时再一次看见回调函数,想到在网上去查查详细的知识,没想到查出一大堆讲同步异步的,看了不少人的文章,这才感觉自己 ...
- 关于js的回调函数,同步回调与异步回调
回调定义 刚开始学习javascript时,对回调函数的理解仅仅停留在知道定义阶段.什么是回调函数? 就是将一个函数作为参数传递给另一个函数,作为参数的这个函数就是回调函数. 至于为什么要用到回调函数 ...
- JS 异步发展流程(回调函数=Async/await)
异步编程的语法目标,就是怎样让它更像同步编程 什么是异步? 异步任务指的是,不进入主线程.而进入"任务队列"(task queue)的任务,只有"任务队列"通知 ...
- node.js 使用domain模块捕获异步回调中的异常
和其他服务器端语言相比,貌似node.js 对于异常捕捉确实非常困难. 首先你会想到try/catch ,但是在使用过程中我们会发现并没有真正将错误控制在try/catch 语句中. 为什么? 答案是 ...
- Java接口回调,异步回调理解
文章目录 前言 一.回调简单理解 二.Java中用接口实现回调 1.实现接口回调 1.1同步回调 1.2 异步回调 2.为啥要用接口实现 3.关于接口(基础) 总结 前言 本文是作者在学习接口回调时看 ...
最新文章
- 宜阳一高中历年录取分数线_上海高中TOP30!从录取分数线看上海高中排名!
- Intel Realsense 图像投影(Projection)翻译
- Adblock Plus cjxlist 规则说明与反馈贴
- Docker1.8在Centos7下的安装
- [转]cubemap soft shadow
- 鸿蒙分布式体验,一张图看懂鸿蒙OS 2.0 分布式能力升级构筑全场景体验
- android 控件覆盖关系,安卓子控件抢占父控件点击事件或者焦点问题
- gtone eclipse plugin install
- 珍藏40个android应用源码分享
- 华为电脑c盘哪些文件可以删除,c盘可以删除哪些文件
- python安装matplotlib绘图库
- window7系统搭建FTP服务端,使用FileZilla FTP客户端测试
- 2022年执法资格通用法律知识考试判断题专项训练题及答案
- 拼多多下单助手怎么一键采购、发货的?
- Nginx服务器读取不到文件的转换方法
- Linux:xinetd服务安装与配置(操作环境:Ubuntu 18.04)
- 解决导出CSV文件乱码的问题
- linux shell中实现循环日期和月份
- 工作之余找到生活的意义
- 【转】一个小公司老板的日常管理,希望能让创业的朋友学到东西
热门文章
- java进账和转账需要锁吗,Spring与Java中的锁
- 区块链 怎么设置区块最大交易容量
- ubuntu apt 卸载 golang
- Docker教程小白实操入门(12)--如何使用build指令根据Dockerfile文件构建一个镜像
- [thinkphp] page类整合bootstrap分页样式
- mpchart点击_MPAndroidChart实现K线面板(一)
- matlab 数字基带,基于MATLAB的数字基带传输的 FIR滤波器的设计
- mysql查询语句内连接、左连接、右连接以及全连接查询
- 动画效果之PC端 移动端 探照灯遮罩动画
- MySQL学习(一、概述和表的基本操作)