成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS異步筆試題

Tangpj / 2933人閱讀

摘要:分析題目先執(zhí)行微任務(wù)后執(zhí)行宏任務(wù)因此結(jié)果為按照這個思路做以下題目做出如下更改運行結(jié)果為更改如下更改如下運行結(jié)果為運行結(jié)果為運行結(jié)果為參考自

參考自https://github.com/Advanced-F...

以下是一道異步的筆試題,寫出運行結(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");

運行結(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ù)隊列中讀取任務(wù),執(zhí)行任務(wù),這種運行機制為事件循環(huán).

2.Microtasks, Macrotasks
Microtasks(微任務(wù))和Macrotasks(宏任務(wù))是異步任務(wù)的一種類型,Microtasks的優(yōu)先級要高于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. 一個任務(wù) task 可以放入 macrotask queue 也可以放入 microtask queue中
4. 每一次event loop,會首先執(zhí)行 microtask queue, 執(zhí)行完成后,會提取 macrotask queue 的一個任務(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

按照這個思路,做以下題目:

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");

運行結(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");

運行結(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")

運行結(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")

運行結(jié)果為

script start
async1 start
async2
promise1
script end
async1 end
promise2
settimeout

參考自https://github.com/Advanced-F...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/105224.html

相關(guān)文章

  • 一道setTimeout async promise執(zhí)行順序的試題引發(fā)的思考

    摘要:如果你要問他和誰當(dāng)進去的快,要從下面兩個方面考慮結(jié)束時。至于什么,查了很多的資料,了解到一個瀏覽器環(huán)境只能有一個事件循環(huán),而一個事件循環(huán)可以有多個任務(wù)隊列。 ====據(jù)說這是今日頭條去年的一道筆試題,主要考察的是setTimeout async promise執(zhí)行順序 ~先雙手奉上這道題目~ async function async1() { consol...

    soasme 評論0 收藏0
  • 大管家試題(深圳)

    摘要:子選擇器和后代選擇器的區(qū)別子選擇器是選擇元素的直接后代,即作用于第一個后代后代選擇器則可作用于孫子代曾孫子代等。后代選擇器通過空格來進行選擇,而子選擇器是通過進行選擇。 1.css選擇器有哪些,優(yōu)先級如何計算 類別選擇器、ID選擇器、標(biāo)簽選擇器、通用選擇(*)、后代選擇器、偽類選擇器 !important>行內(nèi)樣式>ID選擇器>類選擇器>標(biāo)簽>通配符>繼承>瀏覽器默認屬性 同一級別中...

    sorra 評論0 收藏0
  • 大管家試題(深圳)

    摘要:子選擇器和后代選擇器的區(qū)別子選擇器是選擇元素的直接后代,即作用于第一個后代后代選擇器則可作用于孫子代曾孫子代等。后代選擇器通過空格來進行選擇,而子選擇器是通過進行選擇。 1.css選擇器有哪些,優(yōu)先級如何計算 類別選擇器、ID選擇器、標(biāo)簽選擇器、通用選擇(*)、后代選擇器、偽類選擇器 !important>行內(nèi)樣式>ID選擇器>類選擇器>標(biāo)簽>通配符>繼承>瀏覽器默認屬性 同一級別中...

    魏明 評論0 收藏0
  • 前端試題試題記錄(下)

    摘要:前言接上篇前端筆試題面試題記錄上。默認值,不脫離文檔流,,,,等屬性不生效。。不脫離文檔流,依據(jù)自身位置進行偏離,當(dāng)子元素設(shè)置,將依據(jù)它進行偏離。。 前言 接上篇前端筆試題面試題記錄(上)。趁清明小長假,把上篇剩下的部分也寫一下,因為最近比較忙這篇已經(jīng)拖了很久了?,F(xiàn)在剛剛開始銀四了,應(yīng)該還是有些小伙伴在找工作,時間還不算太晚,希望本篇可以幫到這些小伙伴。 個人博客了解一下:obkoro...

    Lin_YT 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<