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