日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

瀏覽器的任務(wù)隊(duì)列-宏任務(wù)、微任務(wù)的執(zhí)行順序

作者:小劉踩坑與知識(shí)點(diǎn)記錄 更新時(shí)間: 2022-08-13 編程語(yǔ)言

重點(diǎn):

1、首先要清楚常見的宏任務(wù)和微任務(wù)有哪些

宏任務(wù):setTimeout、setInterval、ajax;

微任務(wù):promise、async/await

2、其次要清楚的是??微任務(wù) 執(zhí)行時(shí)機(jī)比?宏任務(wù)??早

1、微任務(wù)和宏任務(wù)的執(zhí)行規(guī)則

?此處需要注意的是,當(dāng)所有微任務(wù)執(zhí)行完畢后才會(huì)取出一個(gè)宏任務(wù)執(zhí)行,宏任務(wù)中存在微任務(wù)的話還是需要將所有微任務(wù)執(zhí)行完在取出一個(gè)宏任務(wù)繼續(xù)執(zhí)行。

2、JS運(yùn)行機(jī)制

此處不做過(guò)多介紹,主要注意以下幾點(diǎn):

  1. js是單線程,所謂單線程就是指JS在引擎中只負(fù)責(zé)解釋和執(zhí)行JS代碼的線程只有一個(gè)。這點(diǎn)事核心,將來(lái)也不會(huì)改變。
  2. 同步任務(wù)會(huì)在調(diào)用棧中按照順序等待主線程一次執(zhí)行;異步任務(wù)會(huì)在異步任務(wù)有了結(jié)果后,將注冊(cè)的回調(diào)函數(shù)放在任務(wù)隊(duì)列中,等待主線程空閑的時(shí)候,被讀取到棧內(nèi)等待主線程的執(zhí)行
  3. Promise本身事同步的立即執(zhí)行函數(shù)他的.then()和catch()方法是異步的(微任務(wù))
  4. async/await是建立在Promise機(jī)制上,當(dāng)調(diào)用一個(gè)async函數(shù)時(shí),會(huì)返回一個(gè)promise對(duì)象,而await操作符后面的表達(dá)式就是這個(gè)promise,返回值實(shí)際上就是peomise的回調(diào)函數(shù)resolve的參數(shù)。
  5. async方法執(zhí)行時(shí),遇到await會(huì)立即執(zhí)行表達(dá)式,async表達(dá)式定義的函數(shù)是立即執(zhí)行的await表達(dá)式后面的代碼放在微任務(wù)執(zhí)行,包括賦值。

以下舉幾個(gè)例子

async function test1() {
    console.log("test1 begin");
    const result = await test2();
    console.log("result", result);
    console.log("test1 end");
  }
  async function test2() {
    console.log("test2");
  }
  console.log("script begin");
  test1();
  console.log("script end");

控制臺(tái)打印:

?前面注意事項(xiàng)5中說(shuō)了,async方法執(zhí)行時(shí),遇到await會(huì)立即執(zhí)行表達(dá)式,所有第三次輸出應(yīng)該是test2。await后面的代碼將放在微任務(wù)中排隊(duì)。

結(jié)果: 1 4 7 5 2 3 6

原文鏈接:https://blog.csdn.net/weixin_46545002/article/details/126285202

欄目分類
最近更新