宏任务 和 微任务、观察者以及模块
文章目录
一、宏任务 和 微任务
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
并发模型与事件循环
JavaScript 有一个基于事件循环的并发模型,事件循环负责执行代码、收集和处理事件以及执行队列中的子任务。这个模型与其它语言中的模型截然不同,比如 C 和 Java。
运行时概念
接下来的内容解释了这个理论模型。现代 JavaScript 引擎实现并着重优化了以下描述的这些语义。
事件循环
在JavaScript
中,所有的任务都可以分为
- 同步任务:立即执行的任务,同步任务一般会直接进入到主线程中执行
- 异步任务:异步执行的任务,比如
ajax
网络请求,setTimeout
定时函数等
宏任务 和 微任务
第一个宏任务开始,直接暴露在script元素中的代码属于全局作用域。
console.log(1);
函数setTimeout
本身的执行属于同步操作,但setTimeout
第一个参数对应的函数属于异步任务.
setTimeout( () => console.log(2), 0 );
览器处理到script时会立即创建一个宏任务
let p = new Promise((resolve, reject)=>{
console.log(3);
resolve();
});
在当前宏任务中创建一个微任务
p.then( () => console.log(4) );
同一个script元素内属于一个宏任务,从第二个宏任务开始,在当前宏任务中创建一个微任务,并且用setTimeout
注册一个宏任务。
setTimeout( () => console.log(6), 0 );
由setTimeout
注册的回调操作属于异步任务(宏任务)
setTimeout( add, 0, 2, 3 );
const endTime = Date.now() + 10000;
let showTime = () => {
let datetime = new Date();
console.log( 'macro task 3: ', datetime.toISOString() );
if( datetime > endTime ) {
clearInterval(timer); // 清除timer对应的定时器
}
};
而由setInterval
注册的回调操作属于异步任务(宏任务)
const timer = setInterval( showTime, 1000