欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一篇文章帶你了解vue.js的事件循環(huán)機制

 更新時間:2022年03月04日 11:33:10   作者:三月的一天  
這篇文章主要為大家詳細介紹了vue.js事件循環(huán)機制,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

一、事件循環(huán)機制介紹       

JS是單線程的語言,瀏覽器和Node.js定義了各自的Event Loop(事件循環(huán)機制)則是用來解決異步問題。將程序分為“主線程(執(zhí)行棧)”與“Event Loop線程”,“主線程”自上而下依次執(zhí)行同步任務,“Event Loop線程”將異步任務推入宏任務隊列與微任務隊列去執(zhí)行。

事件循環(huán)機制從整體上告訴了我們 JavaScript 代碼的執(zhí)行順序 Event Loop 即事件循環(huán),是指瀏覽器或Node 的一種解決javaScript 單線程運行時不會阻塞的一種機制,也就是我們經常使用異步的原理。“Event Loop線程”先執(zhí)行宏任務隊列,然后執(zhí)行微任務隊列,若微任務在執(zhí)行過程中產生了新的微任務,則繼續(xù)執(zhí)行微任務,微任務執(zhí)行完畢后,再回到宏任務中進行下一輪循環(huán)。即繼續(xù)先執(zhí)行宏任務隊列,再執(zhí)行 微任務隊列。

宏任務:

script(整體代碼)/setTimeout/setInterval/setImmediate/ I/O / UI Rendering

微任務:

process.nextTick()/Promise/Async、Await(實際就是Promise)/MutationObserver(html5新特性)

setTimeout 和 setInterval 等都是任務源,真正進入任務隊列的是他們分發(fā)的任務。

優(yōu)先級

setTimeout = setInterval 一個隊列setTimeout > setImmediate process.nextTick > Promise

二、經典事件循環(huán)面試題

1.在下面這段代碼是面試中關于這類問題的經典考題,其中包含了同步、異步任務,幾個輸出的先后順序是怎樣的。

setTimeout(function(){
    console.log('1')
});
new Promise(function(resolve){
    console.log('2');
    resolve();
}).then(function(){
    console.log('3')
});
console.log('4');
// 2,4,3,1

首先進行任務劃分,同步任務:new Promise()、console.log('4');宏任務setTimeout();微任務Promise().then()Event Loop依次將同步任務推入執(zhí)行棧并執(zhí)行,當遇到宏任務或微任務時,推到宏任務或微任務隊列中。先執(zhí)行同步任務,同步隊列執(zhí)行完畢,會去微隊列取任務,直到微隊列清空,再去宏隊列取任務執(zhí)行。故此段程序執(zhí)行順序為:

new Promise()、console.log('4')、Promise().then()、setTimeout()。

 2.示例2

 答案輸出為:async2 end => Promise => async1 end => promise1 => promise2 => setTimeout

3.示例3

        mounted(){
            this.test();
 
        },
        methods:{
            test(){
                console.log('script start');
 
                this.async1();
 
                setTimeout(function() {
                 console.log('setTimeout')
                }, 0);
 
                new Promise(resolve => {
                    console.log('Promise')
                    resolve()
                })
                .then(function() {
                console.log('promise1')
                })
                .then(function() {
                console.log('promise2')
                })
 
                console.log('script end')
            },
            async async1() {
                await this.async2()
                    console.log('async1 end')
            },
            async async2() {
              console.log('async2 end')
            },
        }

新版的chrome瀏覽器中不是如上打印的,因為chrome優(yōu)化了,await變得更快了,輸出為:

// script start => async2 end => Promise => script end => async1 end => promise1 => promise2

分析這段代碼:

  • 執(zhí)行代碼,輸出script start。
  • 執(zhí)行async1(),會調用async2(),然后輸出async2 end,此時將會保留async1函數(shù)的上下文,然后跳出async1函數(shù)。
  • 遇到setTimeout,產生一個宏任務
  • 執(zhí)行Promise,輸出Promise。遇到then,產生第一個微任務
  • 繼續(xù)執(zhí)行代碼,輸出script end
  • 代碼邏輯執(zhí)行完畢(當前宏任務執(zhí)行完畢),開始執(zhí)行當前宏任務產生的微任務隊列,輸出promise1,該微任務遇到then,產生一個新的微任務 
  • 執(zhí)行產生的微任務,輸出promise2,當前微任務隊列執(zhí)行完畢。執(zhí)行權回到async1 
  • 執(zhí)行await,實際上會產生一個promise返回,即
  • let promise_ = new Promise((resolve,reject){ resolve(undefined)})
  • 執(zhí)行完成,執(zhí)行await后面的語句,輸出async1 end 最后,執(zhí)行下一個宏任務,即執(zhí)行setTimeout,輸出setTimeout
  • 注意以上分析是舊版瀏覽器await執(zhí)行慢導致async1在微任務執(zhí)行后執(zhí)行。

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!

相關文章

  • Element-ui?DatePicker日期選擇器基礎用法示例

    Element-ui?DatePicker日期選擇器基礎用法示例

    這篇文章主要為大家介紹了Element-ui?DatePicker日期選擇器基礎用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • Vue使用Composition?API生成計算屬性computed

    Vue使用Composition?API生成計算屬性computed

    這篇文章主要為大家詳細介紹了Vue如何使用Composition?API實現(xiàn)生成計算屬性computed,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-06-06
  • vue開發(fā)之不同瀏覽器的類型判斷方式

    vue開發(fā)之不同瀏覽器的類型判斷方式

    這篇文章主要介紹了vue開發(fā)之不同瀏覽器的類型判斷方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Vue iframe更改src后頁面未刷新問題解決方法

    Vue iframe更改src后頁面未刷新問題解決方法

    這篇文章主要介紹了Vue iframe更改src后頁面未刷新問題解決,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • Vue3項目中引入ElementUI并使用的示例詳解

    Vue3項目中引入ElementUI并使用的示例詳解

    ElementUI是一個強大的PC端UI組件框架,它不依賴于vue,但是卻是當前和vue配合做項目開發(fā)的一個比較好的ui框架,本文主要介紹了如何在vue3中引入使用ElementUI,需要的可以參考一下
    2023-06-06
  • vue3使用xgPalyer實現(xiàn)截圖功能的方法詳解

    vue3使用xgPalyer實現(xiàn)截圖功能的方法詳解

    這篇文章主要為大家詳細介紹了如何在vue3中使用xgPalyer截圖功能,以及自定義插件,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-02-02
  • vue中組件如何使用vue-quill-editor

    vue中組件如何使用vue-quill-editor

    這篇文章主要介紹了vue中組件如何使用vue-quill-editor問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • vue本地模擬服務器請求mock數(shù)據(jù)的方法詳解

    vue本地模擬服務器請求mock數(shù)據(jù)的方法詳解

    這篇文章主要給大家介紹了關于vue本地模擬服務器請求mock數(shù)據(jù)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-03-03
  • Vue3中element-plus全局使用Icon圖標的過程詳解

    Vue3中element-plus全局使用Icon圖標的過程詳解

    我們在用vue開發(fā)網站的時候,往往圖標是起著很重要的作,這篇文章主要給大家介紹了關于Vue3中element-plus全局使用Icon圖標的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-01-01
  • Vue3實現(xiàn)word轉成pdf代碼的方法

    Vue3實現(xiàn)word轉成pdf代碼的方法

    在Vue 3中,前端無法直接將Word文檔轉換為PDF,因為Word文檔的解析和PDF的生成通常需要在后端進行這篇文章主要介紹了Vue3實現(xiàn)word轉成pdf代碼的方法,需要的朋友可以參考下,
    2023-07-07

最新評論