异步编程是一种编程模式。
JavaScript 是单线程的,只有一个线程可以执行代码。
这意味着,所有代码都只能在一个线程中按顺序执行,这很容易导致代码执行的阻塞。
代码的每一个语句都需要被执行,为了完成某个计算任务需要一定的执行时间。不同任务的执行时间之间的差别可能是数量级的。
根据执行时间的数量级(或长短)可以把计算任务粗略分为两种:
- 简单任务,执行时间的数量级较低(或执行时间较短)的计算任务。
- 复杂任务,执行时间的数量级较高(或执行时间较长)的计算任务。
线程阻塞,即在执行代码时,先执行了复杂任务,使后面的简单任务一直处于等待状态。
线程阻塞是 “不合理” 的,应该优先执行简单任务,再执行复杂任务。
线程阻塞的解决办法是对任务的执行顺序进行调整,即使用异步编程,即将可能是复杂任务的任务从当前的执行中抛出,在若干任务执行完后再执行被抛出的任务。
这种将计算任务从当前的执行中抛出,在其它若干任务执行完后再执行被抛出的任务的编程模式被称为异步编程。
主要参考资料:
- 《JavaScript 高级程序设计(第4版)》- P322(347/931)
消息队列
为了实现异步编程,JavaScript 维护了一个任务队列,用于调度不同任务的执行顺序。
这个任务队列通常被称为消息队列。
消息队列是一个队列。遵守先入先出的规则。
消息队列存储了需要执行的任务。
消息队列中的任务会按顺序出列,出列的任务会被执行。
将某个任务入列(添加)到消息队列中的操作,被称为排期。
主要参考资料:
- 《JavaScript 高级程序设计(第4版)》- P368(393/931)
常用的异步 API
异步 API ,即可以排期任务的 API ,即异步 API 可以向消息队列添加任务。
常用的异步 API :
- BOM - 对象 window - 定时器