請教乙個關於 js 中 async await 的問題

時間 2021-05-12 12:24:22

1樓:

因為忽略了secA 裡的 setTimeout(() => resolve('resolved'), 1000),這一行對整體程式的影響。而且我目測圖里 2: resolved 後面應該不是 after 2s,應該是 after 1s。

這個問題涉及的知識點不僅是 async/await 還有微任務和巨集任務,promise 等,確實是個厲害的面試題哈哈哈

promise 優於 setTimeout 執行

1-1 是同步直接執行的,1-2 也是同步輸出的 Promise 物件(sec 裡的那行 setTimeout 並沒有執行)。

然後是 secA 這個執行體執行,此時亮點來了,secA 帶有 await,也就是會等待 secA 執行完成後才會繼續執行下面的,secA 裡面有一行 setTimeout(() => resolve('resolved'), 1000),那麼這一行執行的時候,3-1 這一行也其實也已經進入非同步任務佇列了,但是注意 3-2 沒有進入(因為它在 await 的後面)

secA 裡的 setTimeout 延時 1000ms 才執行 resolve,執行 resolve 後 await 才算執行完。,3-1 延時 2000ms,secA 執行完後,開始執行 3-2,但注意,此時 3-1 還沒有執行完成 ,按照時間差來算,secA 執行完成後 3-1 還有 1000ms 延時才執行。

secA 執行後,開始執行 3-2 ,3-2 延時 1000ms,和 3-1 延時一樣。所以2: resolved 後應該 after 1s ,3-1 3-2 的全部執行。

也符合你題目的 'after 2s' 和 'after 1s』會同時列印的現象。

補充下事件迴圈

多個 setTimeout 進入非同步佇列也不是按照先執行 3-1,然後等待 3-1 任務有返回後再去執行 3-2 的順序。

順手找了個圖,3-1secA 裡的 setTimeout(() => resolve('resolved'), 1000)3-2都會通過 WebApis 的 setTimeout 去執行,然後這三個非同步任務執行完後把結果弄進 Callback Queue 裡。

PS:

可以嘗試把 3-2 的延時改為 0 或者小於 1000ms 幾十ms 的值(比如 980ms,950ms等)。因為非同步佇列是有延時的。不一定嚴格按照延時來執行,所以設定成 0 會比較直觀。

也可以試試把 secA 裡的 setTimeout(() => resolve('resolved'), 1000) 的延時改為 0,

相信你會有更深的理解。

2樓:毛呆

無關內容太多,首先先剔除無關部分:

const

test

=async

()=>

)setTimeout

(()=>

console

.log

('after 1s'

),1000

)console

.log

(secA)}

我認為將async/await轉換成then表示會更容易理解,

await語句之後的內容全部塞到then裡面。

並用字母注釋做標記,方便後續說明。

const

test

=async

()=>

).then

((secA

)=>)}

執行test

A. 新建巨集任務,2000ms 之後執行 console.log('after 2s') 。

B. 新建巨集任務,1000ms 之後執行 resolve('resolved') 。

等待 1000ms 之後

B 的巨集任務執行,新建微任務(即 then 裡的內容)。

執行棧已經空了,開始執行微任務。

C. 新建巨集任務,1000ms 之後執行 console.log('after 1s') 。

D. 立即列印 'resolved' 。

再等待 1000ms 之後

A 的巨集任務執行,列印 'after 2s' 。

緊接著,C 的巨集任務也可以執行了,列印'after 1s' 。

在理想狀態下 A 和 C 的巨集任務是同時執行的,但由於 A 的巨集任務是先推入巨集任務佇列,所以 A 的巨集任務會先執行。不理想狀態下,C 會在 A 推入佇列 1000ms+ 之後推入佇列,所以執行得會更晚一點。總之 C 都是在 A 之後再執行。

3樓:這個碼農有點冷

執行過程是這樣的: await相當於乙個關鍵字,後面可以是表示式,也可以是乙個字面量。await的阻塞特性導致他在等待promise的執行結果,定時器1s後執行完畢獲得返回值,await才執行,然後阻塞結束,走到下一行,1s定時器的執行。

結果便如此。

這裡核心點是:await 等候Promise的返回值,並將結果返回給Promise執行.

請教乙個關於電腦功率的問題?

月影 先回答三個提問。1,整機功率不會超過電源介面卡功率 除去一些極其特殊的情況,平時遇不到的,放心啦 2,如果超過會導致介面卡因為電流過大而短時間發熱長時間燒毀 我只是非專業的,按照經驗答的,具體是電流過載還是電壓電流都過載什麼的就不知道了 這個也導致自己換電源介面卡可以選功率更大的而不能選功率更...

請教乙個關於模電的乙個小問題?

快樂生活 先說結論 這是乙個絕對值放大器,通俗的說,整流電路。Uo Ui 分析 當訊號的正半周到來時,VD是截止的,A2是乙個比較器 正負輸入端虛斷 對A1的工作完全不影響,只計算A1的輸出,此時 Uo 1 R R Ui R R Ui Ui A1可以看作同時擁有正端輸入的2倍放大器和負端輸入的1倍反...

請教大家乙個關於落地燈的事?

落地燈有幾個非常大的優勢,如方便移動,落地燈大都造型美觀,可以用作裝飾房間,落地燈作為局域照明,可照亮的區域比檯燈大。如果選擇使用在書房的落地燈,首先落地燈的風格顏色應該與你房間的格調和裝修特色相匹配,書房一般選擇樸素典雅簡約造型的落地燈比較好。因為是用在書房,應該是比較重視落地燈的照明功能的。落地...