3、異步編程-JS種事件隊列的優先級


一、任務隊列 > 事件循環(onclick、settimeout)之上

在JS中ES6 中新增的任務隊列(promise)是在事件循環(onclick、settimeout、ajax)之上的,事件循環每次 tick 后會查看 ES6 的任務隊列中是否有任務要執行,也就是 ES6 的任務隊列比事件循環中的任務(事件)隊列優先級更高。

如 Promise 就使用了 ES6 的任務隊列特性。也即在執行完任務棧后首先執行的是任務隊列中的promise任務。其他的上面常見的異步操作加入隊列的時間沒有相應的優先級

setTimeout(function(){console.log('111')},0);
new Promise(function(resolve,reject){
   console.log("2222");//此處還沒有執行異步操作,執行異步操作及執行回調函數,在promise中即then中的回調
  resolve();
}).then(function(){console.log('3333')})
console.log("44444");
//輸出
// 2222
// 44444//上面的兩個輸出屬於同步操作
// 3333//promise加入到隊列的優先級高於setTimeout
//111

注:

1)、onclick 由瀏覽器內核的 DOM Binding 模塊來處理,當事件觸發的時候,回調函數會立即添加到任務隊列中。
2)、setTimeout 會由瀏覽器內核的 timer 模塊來進行延時處理,當時間到達的時候,才會將回調函數添加到任務隊列中。 3)、ajax 則會由瀏覽器內核的 network 模塊來處理,在網絡請求完成返回之后,才將回調添加到任務隊列中。

二、同時在嵌套異步操作中,會將嵌套的異步加入到下次的任務隊列中,以此類推(如嵌套的promise)

new Promise(function(resolve,reject){
  resolve();
}).then(function(){
    console.log("111");
    return new Promise(function(resolve,reject){
   resolve();
})
}).then(function(){ console.log("222");})

new Promise( function(resolve,reject){
    resolve();
}).then(function(){ console.log("33333");})
//輸出
111 33333 222

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM