js事件轮询机制

这段代码的执行顺序,根据执行顺序分析、JS事件轮询原理

 console.log('script start');     // 1       
 setTimeout(function () {
      console.log('settimeout')               // 6           
 });
let promise1 = new Promise(function (resolve) {
    console.log('promise1')            // 2
    resolve()
    console.log('promise1 end')          // 3 
}).then(function () { 
    console.log('promise2')                // 5     
});
console.log('script end');             // 4         

执行逻辑

  • 从代码执行角度来看 首先分析同步代码、在面的代码中异步代码只有promise.then回调与settimeout回调,所以他们肯定是最后执行的、其他同步代码按照书写顺序自上向下执行
  • promise.then回调虽然是异步执行,但是resolve()触发后实际上回调函数被加入到了js同步函数队列末尾,在轮询过程中仍然会作为同步代码优先执行
  • settimeout定时器在js中是由一个单独模块管理、其回调函数也是由一个单独队列管理,在js同步队列执行完毕,才会执行定时器队列代码

结论

  • 在js中代码的执行实际上是由两个队列来组织代码执行时序的(主线程队列、定时器队列),优先轮询主线程队列、主线程队列空闲轮询定时器队列。
  • 实际上我们全局代码也在一个全局函数中,此函数在js解释器开始工作时,总是排在主线程队列头部。

你可能感兴趣的:(js事件轮询机制)