ホームページ >ウェブフロントエンド >jsチュートリアル >Promise の実行順序が JavaScript の期待と一致しないのはなぜですか?
問題:
次のスニペットは、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>
結果は、実行順序が次のとおりであることを示しています。
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... の期待は結果とどのように異なりますか?
答え:
コメント:
Promise を .then() コールバックから返さずに .then() ハンドラー内で実行すると、アタッチされていない新しい Promise シーケンスが作成され、どの親 Promise とも同期しません。方法。これは一般にバグとみなされ、通常は意図された動作ではないため、一部の Promise エンジンはこの問題が発生すると警告を発行します。有効な使用例は、エラーも同期も問題にならない「ファイア アンド フォーゲット」操作です。
Promise.resolve() .then() ハンドラー内の Promise は、親から独立して実行される新しい Promise チェーンを作成します。鎖。 AJAX 呼び出しなどの実際の非同期操作では、独立した切断されたプロミス チェーンの動作を予測できません。完了のタイミングは不定です。たとえば、完了の順序が不明な 4 つの AJAX 呼び出しを並行して起動します。提供されているコードでは、すべての操作が同期されており、一貫した動作が得られますが、Promise の設計目的は非同期実行であるため、これに依存すべきではありません。
概要:
行ごとの分析:
結論:
Promise.resolve() に特定の順序がないことは、.then() ハンドラー内での Promise の実行と同様に、さまざまなエンジンの .then() ハンドラー スケジューリングと setTimeout() の不確定性から、Promise の連鎖を通じて実行順序を制御することの重要性が強調されます。
以上がPromise の実行順序が JavaScript の期待と一致しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。