問題:
以下程式碼片段示範了 JavaScript 的使用Promise,而且執行順序很耐人尋味。
<code class="javascript">Promise.resolve('A') .then(function(a){console.log(2, a); return 'B';}) .then(function(a){ Promise.resolve('C') .then(function(a){console.log(7, a);}) .then(function(a){console.log(8, a);}); console.log(3, a); return a;}) .then(function(a){ Promise.resolve('D') .then(function(a){console.log(9, a);}) .then(function(a){console.log(10, a);}); console.log(4, a);}) .then(function(a){ console.log(5, a);}); console.log(1); setTimeout(function(){console.log(6)},0);</code>
結果顯示執行順序是:
1 2 "A" 3 "B" 7 "C" 4 "B" 8 undefined 9 "D" 5 undefined 10 undefined 6
提出的問題是為什麼執行順序不是1, 2 , 3, 4...,1, 2, 3, 4 .... 的期望與結果有何不同?
答案:
註解:
在.then() 處理程序中執行Promise,而不是從.then () 回呼返回它們,會建立一個新的、獨立的Promise 序列,該序列不會與任何父Promise 同步。方式。這通常被認為是一個錯誤,一些承諾引擎在發生時會發出警告,因為它通常不是預期的行為。一個有效的用例可能是「即發即忘」操作,其中既不關心錯誤,也不關心同步。
.then() 處理程序中的 Promise.resolve() Promise 建立獨立於父級運作的新 Promise 鏈鏈。對於實際的非同步操作(例如 AJAX 呼叫),獨立的、斷開連接的 Promise 鏈沒有可預測的行為。完成時間是不確定的,就像並行啟動四個 AJAX 調用,但完成順序未知。在提供的程式碼中,所有操作都是同步的,從而產生一致的行為,但不應依賴這一點,因為 Promise 的設計目的是非同步執行。
總結:
逐行分析:
結論:
.then() 處理程序中的Promise.resolve() 承諾執行缺乏特定的順序,以及各種引擎的.then() 處理程序調度與setTimeout() 的不確定性,突顯了透過連結承諾控制執行順序的重要性。
以上是為什麼 Promise 執行順序與 JavaScript 中的期望不符?的詳細內容。更多資訊請關注PHP中文網其他相關文章!