-
直到ES6,JavaScript才真正内建有直接的异步概念
-
事件循环机制
-
处理程序中多个块的执行
-
JavaScript引擎本身并没有时间的概念,只是一个按需执行JavaScript任意代码片段的环境。“事件”调度总是由包含它的环境进行。
-
什么是事件循环
- 伪代码
var eventLoop = []; var event; // 永远执行的循环 while (true) { // 一次tick if (eventLoop.length > 0) { // 拿到队列中的下一个事件 event = eventLoop.shift(); // 现在执行下一个事件 try { event(); } catch (err) { reportError(err); } } }
- setTimeout(..)并没有把你的回调函数挂在事件循环队列中。它所做的是设定一个定时器。当定时器到时后,环境会把你的回调函数放在事件循环中,这样在未来某个时刻的tick会摘下并执行这个回调
-
ES6从本质上改变了在哪里管理事件循环
- 在技术上将事件循环管理纳入JavaScript引擎的范围,而不是只由宿主环境来管理
- 引入Promise,对事件循环队列的调度运行直接进行精细控制
-
-
并行线程
-
“异步”和“并行”
- 异步是关于现在和将来的时间间隙
- 并行是关于能够同时发生的事情
-
并行常见的工具是进程和线程。多个线程能够共享单个进程的内存
-
事件循环把自身的工作分成一个个任务并顺序执行,不允许对共享内存的并行访问和修改。通过分立线程中彼此合作的事件循环,并行和顺序执行可以共存。
-
-
并发
- 是指两个或者多个事件链随时间发展交替进行,以至于在更高层次来看,就像在同时运行
-
任务
-
在ES6中,有一个新的概念建立在事件循环队列之上,叫任务队列(job queue)
- 它是挂在事件循环队列的每个tick之后的一个队列。在事件循环的每个tick中,可能出现的异步工作不会导致一个完整的新事件添加到事件循环中,而会在当前的tick的任务队列末尾添加一个任务
-
- 回调函数包裹或者封装了程序的延续(continuation)
XMind: ZEN - Trial Version