Vito's blog
  • js基础
  • es6+基础
  • js进阶
  • js手写系列
  • typescript
  • js读书笔记

    • js异步编程
    • 你不知道的js系列
  • vue2基础
  • vue2进阶
  • vue3基础
  • vuex
  • vue router
  • pinia
html
  • 图解css3
  • css进阶
  • scss
浏览器
网络通信
  • git使用笔记
  • linux使用记录
  • npm
  • webpack基础
  • webpack5
  • qiankun
  • 排序算法
  • 剑指offer
  • 常见算法
  • 排序算法python
  • 剑指offer-python
  • labuladong算法
github主页
  • js基础
  • es6+基础
  • js进阶
  • js手写系列
  • typescript
  • js读书笔记

    • js异步编程
    • 你不知道的js系列
  • vue2基础
  • vue2进阶
  • vue3基础
  • vuex
  • vue router
  • pinia
html
  • 图解css3
  • css进阶
  • scss
浏览器
网络通信
  • git使用笔记
  • linux使用记录
  • npm
  • webpack基础
  • webpack5
  • qiankun
  • 排序算法
  • 剑指offer
  • 常见算法
  • 排序算法python
  • 剑指offer-python
  • labuladong算法
github主页
  • JavaScript异步编程读书笔记

JavaScript异步编程读书笔记

序

本书写的较早,很多案例和讲解的api都以jQuery或一些较老的库为样例,但其中的思想值得借鉴,实际应用中以新的api为准

深入理解JavaScript事件

setTimeout,setInterval计时函数并不是准确的延时后运行的,而是准确的延时后加入任务队列,等待,上一段代码执行完成后再执行;

一个函数在将来会导致另一个函数的运行,这个函数被称为异步的,被运行的函数称为回调函数。
间或异步函数:只在某些时刻是异步的;缓存型异步函数,可缓存结果的异步请求类函数

通过延时而重复相同的函数调用(异步递归),异步递归次数不受限制,容易造成程序崩溃,谨慎使用。仅当没有回调机制时使用

异步函数中抛出的错误只能通过回调捕获,未捕获的异常可能会由运行环境捕获,提倡将throw用作断言结构

分布式事件

PubSub模式

如果想向一个元素的事件绑定多个响应函数(回调函数),需要使用addEventListener方法,一旦发生该事件,则会触发多个回调函数。这种模式称为发布订阅模式(PubSub)。nodejs中则是通过EventEmitter对象实现

事件化模型

只要对象有PubSub接口,就能称为事件化对象.模型改变(数据改变),触发事件进而导致DOM更新的机制称为事件化模型.

对象a的一个事件x触发了对象b的事件y,而y又触发了x,这种相互触发的情况导致了事件循环,但实际双向绑定又必须利用事件循环,因此通常的解决措施是防止在短时间内重复触发.

Promise对象和Deferred对象

在一般性用法中,Promise、Deferred和Future这三个词大体可算作同义词,Deferred算是Promise的超集,Deferred实例可以直接触发

本章中大部分内容在讨论jQuery的Promise语法,其中使用到的思想,Promise对象、管道、Promise对象的合并处理等功能均已在es6中实现,至于进度通知还有待进一步学习

Async的工作流控制

Async.js的async.filter、async.forEach、async.filterSeries、async.forEachSeries用于将异步操作序列化,按照顺序执行。类似于es6中的async函数

async.series和async.waterfall也能实现顺序操作接受一个函数集而不是数据集,async.parallel则支持并行运行类似es6中的Promise.all系列方法

async.queue队列则在并行的基础上可以控制并发度(防止高并发导致系统崩溃),其返回值为一个队列可以向队列中push任务

worker对象的多线程技术

web版的worker对象的使用与事件化模型类似,主要用于解码视频,解析网页式编辑器中的文本。
worker对象看不到window对象、主线程及其他线程中的对象postMessage发送的消息会被序列化,类似JSON,importScripts同步加载脚本函数可用于子线程中

node版使用cluster(集群)对象来实现多线程,但cluster不是用过指定脚本而是把运行自己的同一个脚本再次加载,其消息通信方法和web版相似

异步的脚本加载

作者使用了较老的加载方式,需要通过第三方库实现异步加载。es6中提供了import()函数可实现异步加载

Last Updated:
Contributors: vito