JavaScript Promise 執行順序
問題
考慮以下使用Promise 的Java 程式碼:
<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>
登入後複製
🎜>輸出如下:
<code class="text">1
2 "A"
3 "B"
7 "C"
4 "B"
8 undefined
9 "D"
5 undefined
10 undefined
6</code>
登入後複製
問題是關於執行順序的,具體是數字1、2、3、7等等。為什麼不是預期的線性順序 1, 2, 3, 4, ...?
答案
Promise 執行順序
JavaScript Promise 遵循特定的執行規則:
- 非同步執行: Pro then() 處理程序在目前執行緒完成後非同步執行。這是為了確保非同步操作可以在不阻塞主執行緒的情況下完成。
- 巢狀 Promise: 在 .then() 處理程序中建立新的 Promise 而不傳回它們會建立獨立的 Promise 鏈。這些獨立的 Promise 鏈沒有可預測的執行順序。
順序分析
在給定的程式碼中:
初始Promise 會立即解析,所以它的.then() 處理程序(console .log(2, a)) 在console.log(1) (第23 行)之後非同步運行。 - 第 4 行的 .then() 處理程序創建了一個獨立的 Promise 鏈
- 第 12 行的 .then() 處理程序創建了另一個非同步運行的獨立 Promise 鏈。
- 第 19 行的 .then() 處理程序建立了另一個獨立的 Promise 鏈,非同步運作。
- setTimeout() 設定在目前執行緒完成後執行的回調,但不保證在 Promise .then() 處理程序之前或之後執行。
-
非確定性執行
由於.then() 處理程序中創建的獨立Promise 鏈沒有可預測的執行順序,因此3、7、4、8、9、 5、10 的順序取決於特定的Promise 引擎實作。
建議
為了確保非同步操作的特定執行順序,建議:
避免在 .then 中建立獨立的 Promise 鏈() 處理程序。 - 連結 Promise 鏈以確保特定的執行順序。
-
在給定的範例中,從 .then( 傳回 Promise.resolve('C') Promise ) 第 4 行的處理程序將連結承諾鏈並產生預期的順序執行順序。
以上是為什麼 JavaScript Promise 執行順序不像預期的是線性的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!