摘要:分析題目先執(zhí)行微任務(wù)后執(zhí)行宏任務(wù)因此結(jié)果為按照這個(gè)思路做以下題目做出如下更改運(yùn)行結(jié)果為更改如下更改如下運(yùn)行結(jié)果為運(yùn)行結(jié)果為運(yùn)行結(jié)果為參考自
參考自https://github.com/Advanced-F...
以下是一道異步的筆試題,寫出運(yùn)行結(jié)果:async function async1() { console.log("async1 start"); await async2(); console.log("async1 end"); } async function async2() { console.log("async2"); } console.log("script start"); setTimeout(function() { console.log("setTimeout"); }, 0) async1(); new Promise(function(resolve) { console.log("promise1"); resolve(); }).then(function() { console.log("promise2"); }); console.log("script end");
運(yùn)行結(jié)果為:
script start
async1 start
async2
promise1
script end
async1 end
promise2
setTimeout
這道題涉及到事件循環(huán)中函數(shù)執(zhí)行順序的問題,其中包括async,await,setTimeout,Promise函數(shù)
1.event loop
JS主線程不斷的循環(huán)往復(fù)的從任務(wù)隊(duì)列中讀取任務(wù),執(zhí)行任務(wù),這種運(yùn)行機(jī)制為事件循環(huán).
2.Microtasks, Macrotasks
Microtasks(微任務(wù))和Macrotasks(宏任務(wù))是異步任務(wù)的一種類型,Microtasks的優(yōu)先級(jí)要高于Macrotasks,下面是它們所包含的api:
microtasks
process.nextTicks
promise
Object.observe
MutationObserver
macrotasks
setTimeout
setImmerdiate
I/O
UI渲染
1. 每一個(gè) event loop 都有一個(gè) microtask queue
2. 每個(gè) event loop 會(huì)有一個(gè)或多個(gè)macrotaks queue ( 也可以稱為task queue )
3. 一個(gè)任務(wù) task 可以放入 macrotask queue 也可以放入 microtask queue中
4. 每一次event loop,會(huì)首先執(zhí)行 microtask queue, 執(zhí)行完成后,會(huì)提取 macrotask queue 的一個(gè)任務(wù)加入 microtask queue, 接著繼續(xù)執(zhí)行microtask queue,依次執(zhí)行下去直至所有任務(wù)執(zhí)行結(jié)束。
分析題目:
先執(zhí)行微任務(wù)后執(zhí)行宏任務(wù),因此結(jié)果為
script start
async1 start
async2
promise1
script end
async1 end
promise2
setTimeout
按照這個(gè)思路,做以下題目:
async function async1() { console.log("async1 start"); await async2(); console.log("async1 end"); } async function async2() { //async2做出如下更改: new Promise(function(resolve) { console.log("promise1"); resolve(); }).then(function() { console.log("promise2"); }); } console.log("script start"); setTimeout(function() { console.log("setTimeout"); }, 0) async1(); new Promise(function(resolve) { console.log("promise3"); resolve(); }).then(function() { console.log("promise4"); }); console.log("script end");
運(yùn)行結(jié)果為:
script start
async1 start
promise1
promise3
script end
promise2
async1 end
promise4
setTimeout
async function async1() { console.log("async1 start"); await async2(); //更改如下: setTimeout(function() { console.log("setTimeout1") },0) } async function async2() { //更改如下: setTimeout(function() { console.log("setTimeout2") },0) } console.log("script start"); setTimeout(function() { console.log("setTimeout3"); }, 0) async1(); new Promise(function(resolve) { console.log("promise1"); resolve(); }).then(function() { console.log("promise2"); }); console.log("script end");
運(yùn)行結(jié)果為
script start
async1 start
promise1
script end
promise2
setTimeout3
setTimeout2
setTimeout1
async function a1 () { console.log("a1 start") await a2() console.log("a1 end") } async function a2 () { console.log("a2") } console.log("script start") setTimeout(() => { console.log("setTimeout") }, 0) Promise.resolve().then(() => { console.log("promise1") }) a1() let promise2 = new Promise((resolve) => { resolve("promise2.then") console.log("promise2") }) promise2.then((res) => { console.log(res) Promise.resolve().then(() => { console.log("promise3") }) }) console.log("script end")
運(yùn)行結(jié)果為
script start
a1 start
a2
promise2
script end
promise1
a1 end
promise2.then
promise3
setTimeout
async function async1() { console.log("async1 start") await async2() console.log("async1 end") } async function async2() { console.log("async2") } console.log("script start") setTimeout(function () { console.log("settimeout") }) async1() new Promise(function (resolve) { console.log("promise1") resolve() }).then(function () { console.log("promise2") }) console.log("script end")
運(yùn)行結(jié)果為
script start
async1 start
async2
promise1
script end
async1 end
promise2
settimeout
參考自https://github.com/Advanced-F...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/105224.html
摘要:如果你要問他和誰當(dāng)進(jìn)去的快,要從下面兩個(gè)方面考慮結(jié)束時(shí)。至于什么,查了很多的資料,了解到一個(gè)瀏覽器環(huán)境只能有一個(gè)事件循環(huán),而一個(gè)事件循環(huán)可以有多個(gè)任務(wù)隊(duì)列。 ====據(jù)說這是今日頭條去年的一道筆試題,主要考察的是setTimeout async promise執(zhí)行順序 ~先雙手奉上這道題目~ async function async1() { consol...
摘要:子選擇器和后代選擇器的區(qū)別子選擇器是選擇元素的直接后代,即作用于第一個(gè)后代后代選擇器則可作用于孫子代曾孫子代等。后代選擇器通過空格來進(jìn)行選擇,而子選擇器是通過進(jìn)行選擇。 1.css選擇器有哪些,優(yōu)先級(jí)如何計(jì)算 類別選擇器、ID選擇器、標(biāo)簽選擇器、通用選擇(*)、后代選擇器、偽類選擇器 !important>行內(nèi)樣式>ID選擇器>類選擇器>標(biāo)簽>通配符>繼承>瀏覽器默認(rèn)屬性 同一級(jí)別中...
摘要:子選擇器和后代選擇器的區(qū)別子選擇器是選擇元素的直接后代,即作用于第一個(gè)后代后代選擇器則可作用于孫子代曾孫子代等。后代選擇器通過空格來進(jìn)行選擇,而子選擇器是通過進(jìn)行選擇。 1.css選擇器有哪些,優(yōu)先級(jí)如何計(jì)算 類別選擇器、ID選擇器、標(biāo)簽選擇器、通用選擇(*)、后代選擇器、偽類選擇器 !important>行內(nèi)樣式>ID選擇器>類選擇器>標(biāo)簽>通配符>繼承>瀏覽器默認(rèn)屬性 同一級(jí)別中...
摘要:前言接上篇前端筆試題面試題記錄上。默認(rèn)值,不脫離文檔流,,,,等屬性不生效。。不脫離文檔流,依據(jù)自身位置進(jìn)行偏離,當(dāng)子元素設(shè)置,將依據(jù)它進(jìn)行偏離。。 前言 接上篇前端筆試題面試題記錄(上)。趁清明小長假,把上篇剩下的部分也寫一下,因?yàn)樽罱容^忙這篇已經(jīng)拖了很久了?,F(xiàn)在剛剛開始銀四了,應(yīng)該還是有些小伙伴在找工作,時(shí)間還不算太晚,希望本篇可以幫到這些小伙伴。 個(gè)人博客了解一下:obkoro...
閱讀 865·2023-04-26 00:30
閱讀 2780·2021-11-23 09:51
閱讀 1118·2021-11-02 14:38
閱讀 2775·2021-09-07 10:23
閱讀 2333·2021-08-21 14:09
閱讀 1538·2019-08-30 10:57
閱讀 1666·2019-08-29 11:20
閱讀 1209·2019-08-26 13:53