Javascript 语言的执行环境是 – 单线程 (single thread) .
单线程: 指一次只能执行一个任务, 如果有多个任务出现, 则会出现排队现象, 即等待当前的任务执行完成再执行下一个任务, 一次类推.
但是, 如果某一任务耗时多长, 就会导致后面的任务一直处于排队状态, 容易造成浏览器无响应 (假死) .在 Javascript 中, 任务执行的模式被分为两种: 同步 (Synchronous) 和 异步 (Asynchronous) .
同步模式:
即按照任务的排列顺序, 后一个任务等待前一个任务结束,然后再执行, 程序的执行顺序与任务的排列顺序是一致的、同步的.
异步模式:
在异步模式中, 每一个任务都有一个或多个回调函数 (callback), 当前任务执行完成后, 不是执行下一个任务, 而是执行回调函数, 后一个任务也不会等待当前任务执行完再执行, 所以程序的执行顺序与任务的排列顺序是不一致的, 是异步的.
异步模式编程方法:
(一) 回调函数:
通过改写耗时较长的任务, 将之后要执行的任务以回调函数的形式执行, 即把同步执行的任务改写成异步执行, 这样耗时较长的任务不会阻塞程序的执行, 相当于先执行程序的主要部分, 将耗时任务稍后执行.回调函数的优点:
是简单、容易理解和部署.
缺点是不利于代码的阅读和维护,流程会很混乱,各个部分之间高度耦合 (Coupling) , 而且每个任务只能指定一个回调函数。(二) 事件监听:
采用事件驱动模式, 任务的执行不依赖任务的先后顺序, 而取决于某个任务是否触发.回调函数的优点:
是比较容易理解,可以绑定多个事件,每个事件可以指定多个回调函数,而且可以”去耦合” (Decoupling) , 有利于实现模块化。
缺点是整个程序都要变成事件驱动型,运行流程会变得很不清晰。(三) 发布 / 订阅 or 观察者模式:
我们假定,存在一个”信号中心”,某个任务执行完成,就向信号中心”发布” (publish)一个信号,其他任务可以向信号中心”订阅” (subscribe)这个信号,从而知道什么时候自己可以开始执行。这就叫做”发布/订阅模式” (publish-subscribe pattern), 又称”观察者模式” (observer pattern).(四) Promises 对象:
Promises 对象是 CommonJS 工作组提出的一种规范,目的是为异步编程提供统一接口。
简单说,它的思想是,每一个异步任务返回一个 Promise 对象,该对象有一个 then 方法,允许指定回调函数
f1().then(f2);