JavaScript Promise の実行順序が予想どおりに直線的ではないのはなぜですか?

DDD
リリース: 2024-10-24 13:23:31
オリジナル
501 人が閲覧しました

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

JavaScript Promise の実行順序

問題

Promise を使用する次の JavaScript コードを考えてみましょう:

<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. 非同期実行: Promise .then() ハンドラーは、現在の実行スレッドが終了した後に非同期で実行されます。これは、メイン スレッドをブロックすることなく非同期操作を確実に完了できるようにするためです。
  2. ネストされた Promises: .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 エンジンの実装。

推奨事項

非同期操作の特定の実行順序を確保するには、次のことをお勧めします。

  1. .then 内で独立した Promise チェーンを作成しないようにする() handlers.
  2. Promise チェーンをリンクして、特定の実行順序を保証します。

指定された例では、.then( ) 4 行目のハンドラーは Promise チェーンをリンクし、予想される順次実行順序になります。

以上がJavaScript Promise の実行順序が予想どおりに直線的ではないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!