前端基礎進階(八) :事件輪詢機制

js事件輪詢:

  1. js 是一門單線程語言,從上往下執行的,首先,主線程讀取js代碼,此時是同步的環境
  2. 當主線程檢測到異步操做,就會交給其餘異步線程處理,而後繼續執行主線程的的任務
  3. 異步任務執行完畢以後,判斷異步任務的類型,異步任務可分紅宏任務和微任務,像setTimeout、setInterval屬於宏任務,promise.then屬於微任務,不一樣的任務進入不一樣的隊列,等待主線程空閒時候調用。
  4. 當主線程的的同步任務執行完畢以後,開始執行微任務隊列裏面的全部微任務,執行完微任務,就執行宏任務隊列裏面全部的宏任務
  5. 執行完成以後,主線程開始詢問任務隊列裏面是否還有等待的任務,若是有則進入主線程繼續執行

以上步驟重複執行就是事件輪詢promise

  1. 微觀任務是先於宏觀任務的
  2. await: 先將await的結果打印出來,await後面的任務相似於promise放入微任務
  3. 執行到new Promise(),Promise構造函數是直接調用的同步代碼,resolve若是調用的方法也會當即執行,若是調用的是同步方法就會同步執行,若是是異步方法就會按照異步方法執行
  4. 代碼接着運行到promise.then( ),發現這是一個微任務,推入當前宏任務的微任務隊列中。
setTimeout(function () {
         console.log('setTimeout');
     })
     new Promise(function (resolve) {
         console.log('promise');
     }).then(function () {
         console.log('then');
     })
     console.log('console');
function aaa() {
         console.log(123)
     }
     setTimeout(function () {
         console.log('setTimeout');
     });
     (() => new Promise(function (resolve) {
         console.log('promise');
         resolve(aaa())
     }).then(function () {
         console.log('then');
     }))();
     console.log('console');
async function async1() {
        console.log("async1 start")
        await async2()
        console.log("async1 end")
    }

    async function async2() {
        console.log("async2")
    }
    console.log("script script")
    setTimeout(function () {
        console.log("setTimeout")
    }, 0)
    new Promise(function (resolve) {
        console.log("promise1")
        resolve()
    }).then(function () {
        console.log('promise2')
    })
    async1()
    console.log("script end")
console.log('example-start')
    setTimeout(() => {
        console.log('setTimeout-0') 
    }, 0)
    new Promise((resolve, reject) => {
        console.log('promise-1')
        resolve('promise-2')
        Promise.resolve().then(() => console.log('promise-3')) 
    }).then((response) => { 
        console.log(response)
        setTimeout(() => {
            console.log('setTimeout-10') 
        }, 10)
    })
    console.log('example-end')
相關文章
相關標籤/搜索