首先我们先看一下以下代码
setTimeout(function() {
console.log('s1')
}, 0)
setTimeout(function() {
console.log('s2')
Promise.resolve().then(() => {
console.log('s2 - promise')
})
}, 0)
new Promise(function executor(resolve) {
console.log('p1')
resolve()
console.log('p2')
}).then(function() {
console.log('promise then')
})
console.log('end')
在公布结果之前先分析一下以上代码的知识点有哪些?
1.宏任务 2.微任务3.事件循环
主线程从"任务队列"中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)。
宏任务是JavaScript中最原始的异步任务,包括setTimeout、setInterVal、AJAX
等,在代码执行环境中按照同步代 码的顺序,逐个进入工作线程挂起,再按照异步任务到达的时间节点,逐个进入异步任务队列,最终按照队列中的 顺序进入函数执行栈进行执行。
微任务是随着ECMA标准升级提出的新的异步任务,微任务在异步任务队列的基础上增加了【微任务】的概念,每 一个宏任务执行前,程序会先检测中是否有当次事件循环未执行的微任务,优先清空本次的微任务后,再执行下一 个宏任务,每一个宏任务内部可注册当次任务的微任务队列,再下一个宏任务执行前运行,微任务也是按照进入队 列的顺序执行的。
Promise.then catch finally
就为微任务
setTimeOut
为宏任务 放到栈里面不执行 ,new Promise
为同步代码块先执行 then
为微任务不执行console.log(‘p1’)
console.log(‘p2’)
console.log(‘end’)
console.log(‘promise then’)
同步代码>微任务>宏任务
的执行顺序console.log(‘s1’)
console.log(‘s2’)
console.log(‘s2 - promise’)
参考链接:https://www.ruanyifeng.com/blog/2014/10/event-loop.html