先看例子:
new Promise(function(resolve, reject) { console.log(1); setTimeout(function() { console.log("First"); resolve(); }, 1000); console.log(2); } ).then(function() { console.log(3); return new Promise(function(resolve, reject) { setTimeout(function() { console.log("Second"); resolve(); }, 4000); } ); }).then(function() { console.log(4); setTimeout(function() { console.log("Third"); }, 3000); console.log(5); }); console.log(0) // 1 // 2 // 0 // undifined // First // 3 // Second // 4 // 5 // Third
- macro-task(宏任务):包括整体代码script,setTimeout,setInterval
- micro-task(微任务):Promise,process.nextTic
执行机制1:
JS的执行机制是: 首先,判断JS是同步还是异步,同步进入主线程,异步进入Event table 其次,异步任务在Event table中注册函数,当满足特定的条件,被推入Event queue 最后,同步任务进入主线程后一直执行,直到主线程空闲后,才会去Event queue中查看是否有可执行的异步任务,如果有就推入主线程中执行。 循环以上三步执行,这就是Event loop。
执行机制2:
执行一个宏任务,过程中如果遇到微任务,就将其放到微任务的【事件队列】里 当前宏任务执行完成后,会查看微任务的【事件队列】,并将里面全部的微任务依次执行完
这样就不难分析出上面例子的代码执行顺序。