js中有哪些任务
同步任务:就是立即执行的任务,同步任务一般会直接进入到主线程中执行;
而异步任务,就是异步执行的任务,比如ajax网络请求,setTimeout 定时函数等都属于异步任务,异步任务会通过任务队列的机制(先进先出的机制)来进行协调。
异步任务又分为
- 宏任务:script( 整体代码)、setTimeout、setInterval、I/O、UI 交互事件、setImmediate(Node.js 环境)
- 微任务: Promise的then、MutaionObserver、process.nextTick(Node.js 环境)
所有任务的执行顺序
1、讲js代码从上向下进行解释,遇到同步任务就放进主线程里执行,遇到异步任务就先将事件分类为红任务和微任务后,在将其放入事件队列暂时挂起。
2、在同步任务都执行结束后,主线程就开始读取事件队列中提取出微任务开始处理
3、等待所有的微任务都执行完毕后,开始执行一件宏任务,这一件宏任务执行完毕后,跳到第二步
宏任务与微任务运行机制
- 在执行栈中执行一个宏任务。
- 执行过程中遇到微任务,将微任务添加到微任务队列中。
- 当前宏任务执行完毕,立即执行微任务队列中的任务。
- 当前微任务队列中的任务执行完毕,检查渲染,GUI线程接管渲染。
- 渲染完毕后,js线程接管,开启下一次事件循环,执行下一次宏任务(事件队列中取)。
console.log("测试点1") //网上都说console.log是微任务 但是我感觉它是同步任务
for(var i=0;i<1000000000;i++){ //单纯浪费浏览器事件的
}
setTimeout(function() { //宏任务
console.log("测试点2")
}, 0);
var temp = new Promise(function(resolve , reject) {
console.log("测试点3")
resolve()
})
.then(function() { //微任务
console.log("测试点4")
})
.then(function() { //微任务
console.log("测试点5")
})
console.log("测试点6")
//输出为:
//测试点1
//测试点3
//测试点6
//测试点4
//测试点5
//Live reload enabled.
//测试点2