首頁  >  文章  >  web前端  >  為什麼 JavaScript Promise 執行順序不像預期的是線性的?

為什麼 JavaScript Promise 執行順序不像預期的是線性的?

DDD
DDD原創
2024-10-24 13:23:31502瀏覽

Why is the JavaScript Promise execution order not linear as expected?

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 遵循特定的執行規則:

  1. 非同步執行: Pro then() 處理程序在目前執行緒完成後非同步執行。這是為了確保非同步操作可以在不阻塞主執行緒的情況下完成。
  2. 巢狀 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 鏈() 處理程序。
  1. 連結 Promise 鏈以確保特定的執行順序。
在給定的範例中,從 .then( 傳回 Promise.resolve('C') Promise ) 第 4 行的處理程序將連結承諾鏈並產生預期的順序執行順序。

以上是為什麼 JavaScript Promise 執行順序不像預期的是線性的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn