「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > JavaScript Promise .then() ハンドラーはいつ相互に関連して実行されますか?

JavaScript Promise .then() ハンドラーはいつ相互に関連して実行されますか?

2024 年 12 月 11 日に公開
ブラウズ:709

When do JavaScript Promise .then() Handlers Execute in Relation to Each Other?

JavaScript Promises の実行順序を理解する

JavaScript の Promises は、コードが特定のイベントまたは Promise のたびに実行される非同期プログラミング モデルを提供します。 、満たされています。ただし、複数の Promise を扱う場合は、予期しない動作を避けるために実行順序を理解することが重要です。

次のコード スニペットを検討してください:

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);

実行すると、次の出力順序が観察されます:

1
2 "A"
3 "B"
7 "C"
4 "B"
8 undefined
9 "D"
5 undefined
10 undefined
6

実行順序の理解

  1. Promises の非同期解決:
    Promise は、現在の実行スレッドとは独立して解決されます。これは、現在のスレッドの終了後に .then() ハンドラーが非同期で呼び出されることを意味します。
  2. Promises Execute in a Queue:
    .then() ハンドラーは、前述のハンドラーの後に実行されるようにスケジュールされています。ハンドラーが完了します。これらは基本的にキューに入れられているため、1、2 "A"、3 "B" がこの順序で出力されます。
  3. Inner Promises Create Independent Chains:
    Promises created Promise.resolve('C') や Promise.resolve('D') などのネストされた .then() ハンドラー内で、新しい独立した Promise を作成します鎖。これらの内部チェーンは本質的に外部チェーンと同期しません。
  4. 実行順序は決定的ではありません:
    これらの独立したチェーンの実行順序は保証されません。この場合、Promise エンジンは、6 行目と 7 行目の .then() ハンドラーを 6 行目と 7 行目のハンドラーよりも先に実行することを選択します。

Recommendations

特定の実行順序を確保するには、非同期の Promise チェーンの作成を避け、代わりに Promise を順次リンクすることに依存します。以下に示すように、内部の .then() ハンドラーから Promise を返し、親 Promise と連鎖させます。

Promise.resolve('A').then(function (a) {
    console.log(2, a);
    return 'B';
}).then(function (a) {
    var p = Promise.resolve('C').then(function (a) {
        console.log(7, a);
    }).then(function (a) {
        console.log(8, a);
    });
    console.log(3, a);
    return p; // Link the inner promise to the parent chain
}).then(function (a) {
    var p = Promise.resolve('D').then(function (a) {
        console.log(9, a);
    }).then(function (a) {
        console.log(10, a);
    });
    console.log(4, a);
    return p; // Link the inner promise to the parent chain
}).then(function (a) {
    console.log(5, a);
});

console.log(1);

setTimeout(function () {
    console.log(6)
}, 0);

このアプローチでは、実行順序は完全に決定的になります: 1、2 "A"、3 "B"、7 "C"、8 未定義、4 未定義、9 "D"、 10 未定義、5 未定義、および 6.

リリースステートメント この記事は次の場所に転載されています: 1729739979 権利侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3