《你不知道的JavaScript》中卷读书笔记第二部分 异步和性能
第1章 异步
程序中现在运行的部分和将来运行的部分之间的关系就是异步编程的核心
分块的程序
可以把Javascript程序写在单个.js文件中,但是这个程序几乎一定是由多个块组成的。这些块中只有一个是现在执行,其余的则会在将来执行。最常见的块单位是函数。
异步1,从现在到将来的等待,最简单的方法是使用回调函数
1 | //ajax()是某个库中提供的某个Ajax函数 |
异步2,可以使用siteTimeout()
1 | function now(){ |
任何时候,只要把一段代码包装成一个函数,并指定它在某个事件(定时器,鼠标点击,Ajax相应)时执行,你就是在代码中创建了一个将来执行的块,也由此在这个程序中引入了异步机制。
事件循环
Javascript本身没有时间的概念,在处理线程时,浏览器提供了一种机制来处理程序中多个块的执行,且执行每块时调用Javascript引擎,这种机制被称为事件循环。
换句话说,程序通常被分成了很多小块,在事件循环中一个接一个地执行。
(setTimeout这种定时器最多保证能在指定时间后执行,并不能保证一定,列队多的情况会被排后)
并行线程
异步时关于现在和将来的时间间隙,而并行是关于能够同时发生的事情。
Javascript从不跨线程共享数据,这意味着并行我们可以不用考虑。
并发
并发指的是两个或多个”虚拟进程”同时执行。在Javascript中,严格的说同时发生是不正确的,因为Javascript一次只能处理一个事件。
非交互
两个或多个“进程”在同一个程序内并发地交替运行,彼此不想管,就是非交互,非交互的话,不确定性是完全可以接受的。
交互
并发的“进程”需要相互交流,通过作用域或DOM间接交互。
协作
取到一个长期运行的“进程”,并将其分割成多个步骤或多批次任务,使得其他并发“进程”有机会将自己的运算插入到时间循环列队中交替运行。
任务
在ES6中,有一个新的概念建立在时间循环列队之上,叫做任务列队。(遗憾的是,目前为止这是一个没有公开的API机制)
这个机制就是在所有循环列队中的tick(点)后面添加一个任务,确保在其他任何事情完成之前完成它。
语句顺序
代码中语句的顺序和Javascript引擎执行语句的顺序并不一定要一致
第2章 回调
回调是Javascript中最基础的异步模式
ES6提供了更好的异步模式Promise。
Continuation(延续)
1 | //A |
如何判断这段代码的运行顺序,A,B先运行,其中C作为回调函数,在Ajax调用完成后的某个时间运行。
一旦我们以回调函数的形式引入了单个Continuation,我们就要面对代码变的更加难以理解,追踪,调试和维护。
总之此处介绍内容总结,多为少用回调,或者使用分离回调,将功能分开处理。
第3章 Promise
Promise解决了回调函数的 缺乏顺序性 和 可信任性
什么是Promise
Promise 是一种封装和组合未来值的易于复用的机制