单线程模型
单个脚本只能在一个线程上运行(称为主线程)。
同步任务和异步任务
同步任务就是那些没有被挂起、在主线程上排队执行的任务。只有前一个任务执行完毕,才能执行后一个任务。
异步任务是那些被引擎放在一边,不进入主线程、而进入任务队列的任务。只有引擎认为某个异步任务可以执行了,该任务(回调)才会进入主线程执行。排在异步任务后面的代码,不用等待异步任务马上运行,也就是说,异步任务不具有“堵塞”效应。
任务队列和事件循环
JavaScript 运行时,除了一个正在运行的主线程,引擎还提供多个不同类型的任务队列,里面是各种需要当前程序处理的异步任务。
程序执行流程
- 执行主线程中的任务
- 等到同步任务执行完成,就会去看任务队列中的异步任务,如果满足条件,就将异步任务重新放回主线程,这时异步任务就变成同步任务了
- 等到到执行完,下一个异步任务再进入主线程开始执行
JavaScript 使用一种轮询机制一遍又一遍检查异步任务是不是可以进入主线程,这种机制称为事件循环(Event Loop)。
异步操作的模式
回调函数
function f1(cb) {
// ...
cb();
}
function f2() {}
f1(f2);
事件监听
function f1() {
setTimeout(functio n () {
// ...
f1.trigger('done');
}, 1000);
}
f1.on('done', f2);
发布/订阅
jQuery.subscribe('done', f2);
function f1() {
setTimeout(function () {
// ...
jQuery.publish('done');
}, 1000);
}
// 取消订阅
jQuery.unsubscribe('done', f2);
单线程模型
单个脚本只能在一个线程上运行(称为主线程)。
同步任务和异步任务
同步任务就是那些没有被挂起、在主线程上排队执行的任务。只有前一个任务执行完毕,才能执行后一个任务。
异步任务是那些被引擎放在一边,不进入主线程、而进入任务队列的任务。只有引擎认为某个异步任务可以执行了,该任务(回调)才会进入主线程执行。排在异步任务后面的代码,不用等待异步任务马上运行,也就是说,异步任务不具有“堵塞”效应。
任务队列和事件循环
JavaScript 运行时,除了一个正在运行的主线程,引擎还提供多个不同类型的任务队列,里面是各种需要当前程序处理的异步任务。
程序执行流程
JavaScript 使用一种轮询机制一遍又一遍检查异步任务是不是可以进入主线程,这种机制称为事件循环(Event Loop)。
异步操作的模式
回调函数
事件监听
发布/订阅