問題:
new Promise((resolve) => {
console.log(1)
resolve()
}).then(async () => {
console.log(2)
}).then(async () => {
console.log(3)
})
new Promise((resolve) => {
console.log('a')
resolve()
}).then(() => {
console.log('b')
}).then(() => {
console.log('c')
}).then(() => {
console.log('d')
}).then(() => {
console.log('e')
})
回答:
1 a 2 b c d 3 e
但我認為答案是.... 1 a 2 b 3 cde
請幫助分享如何思考以獲得詳細的答案。謝謝。
uj5u.com熱心網友回復:
首先我要解釋的是,沒有人應該依賴兩個獨立的承諾鏈之間的精確時間。它們彼此獨立運行,一旦您在其中任何一個 Promise 鏈(所有現實世界的編程都包含)中插入任何現實世界的異步操作,那么每個鏈的時間與另一個鏈相比是完全不可預測的。
相反,實際代碼中的時間取決于異步操作的時間,而不是其他任何東西。 想象一下,這個 Promise 鏈中的每個步驟都在讀取檔案或進行一些隨機延遲。這些是完全不可預測的操作,因此哪個鏈首先執行什么取決于實際異步操作的時間,而不是本示例中顯示的內容。
因此,試圖剖析每個專案何時進入承諾作業佇列以及何時獲得服務的詳細資訊完全浪費了編程時間,并且在任何實際的編程問題中都沒有用處。
此外,如果您確實需要特定的操作順序,那么您不會使用兩個獨立的 Promise 鏈進行編程。相反,您使用承諾流控制工具(例如將所有內容鏈接到一個鏈中或使用Promise.all(),Promise.race()等...)將執行/完成順序引導到您想要的順序,而不管承諾執行。
然后,我將通過遍歷其中一個 Promise 鏈的前兩個鏈接來解釋 Promise 佇列如何作業的基礎知識,以表明我了解如何解決 Promise,將其添加到 Promise 佇列,然后,當控制即將回傳事件回圈,承諾佇列中最舊的專案開始運行并呼叫其.then()或.catch()處理程式。這只是為了說明您了解如何安排 Promise 的基礎知識,以及它們從自己的作業佇列中以 LIFO 順序獲得服務,并且在事件回圈中的大多數其他事情之前。
然后,我會解釋說,幾年前,為了提高性能,規范更改了一些承諾步驟,并且在規范更改之前或之后的 JS 引擎可能會產生不同的結果。您不應該依賴該級別的實作細節的另一個原因。
如果面試官堅持要我試圖解釋這個問題的確切順序并且不聽我的推理為什么這是一個毫無意義的練習,即使在聽到我關于如何撰寫執行順序很重要的現實世界情況的解釋之后,那么除非這只是一些非常初級的面試官試圖變得聰明(并且比自己更聰明),否則我不得不得出結論,這不是一個作業的好地方。任何高級開發人員都不應堅持認為這是一個非常有價值或實用的練習,除了表明您對 Promise 作業佇列的作業原理有基本的了解。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/478475.html
標籤:javascript 异步等待 承诺 es6-承诺
上一篇:javascript函式中的const變數是每次呼叫還是只初始化一次?
下一篇:如何根據屬性的總和組織物件陣列?
