JavaScript的单线程模型
- 单线程是指单个脚本只在一个线程上运行,其他线程配合
- js使用单线程是因为对于网页脚本语言来讲,多线程过于复杂,有历史原因
- js语言本身不慢,慢的是IO输入输出操作,因此将一些耗时很长的操作挂起执行后面的任务,等到IO操作有结果再执行。
同步任务和异步任务
- 同步任务是没有被挂起的任务,需要排队逐个执行
- 异步任务是被引擎挂起,不在主线程而进入事件队列的任务
- Ajax操作可以是异步也可以是同步
任务对列和事件循环
- 任务队列是引擎提供的一个放异步任务的线程,有多个。
- js执行完所有的同步任务后,就会去看任务队列的异步任务,满足条件以后进入主线程称为同步任务,任务队列清空以后程序结束。
- js如何知道异步任务可以执行了?答案是引擎在同步任务执行完后会有一个轮询机制,一遍遍的检查异步任务是否得到了结果,这种机制就是事件循环“Event Loop”
异步操作模式
- 回调函数
//f2必须等到f1执行完以后再执行 function f1(callback) { // ... callback(); } function f2() {} f1(f2);
- 事件监听
//当f1触发'done'事件以后,执行f2 f1.on('done', f2);
- 发布订阅
发布订阅模式又称观察者模式,中心思想就是每一个任务执行完以后向信号中心发布一个信号,告诉信号中心它已经执行完了,其他任务订阅信号中心得知自己什么时候可以执行。
异步操作流程控制简介
- 串行执行:每次只允许一个异步任务执行
- 并行执行:允许所有异步任务同时执行
- 串行并行结合:每次只允许规定个数的异步任务同时执行。