検索

ホームページ  >  に質問  >  本文

ネストされた Promise の実行順序

<p>ネストされた Promise について読んでいて、チュートリアルでこのコーディングの課題に遭遇しました。このコードの実行順序を説明できる人はいますか? </p> <pre class="brush:php;toolbar:false;">new Promise((resolve) => { 新しい約束((res) => { console.log("c"); 解決(3); レス(2); }).then((応答) => console.log(応答)) }).then((res) => console.log(res));</pre> <p>このコードを実行すると、出力は次のようになりました。 </p> <pre class="brush:php;toolbar:false;">c 2 3</pre> <p>しかし、私は出力が次のようになると予想していました: </p> <pre class="brush:php;toolbar:false;">c 3 2</pre> <p>外側の Promise が最初に解決され、その後内側の Promise が解決されるためです。 </p>
P粉459440991P粉459440991470日前574

全員に返信(2)返信します

  • P粉770375450

    P粉7703754502023-08-17 16:48:21

    ニコラスの答えに加えて、識別子「res」の繰り返しの使用によって行き詰まる可能性があります。 Promise の内部での最初の使用はコールバック関数として行われ、値 2 を Promise に返します。 最後の行の 2 番目の使用は別のスコープにあり、外側の Promise の .then() メソッドのパラメーター名として使用されます。 内容を明確にするために、最後の行の「res」を「outerPromiseResult」に置き換えると役立つかもしれません。

    返事
    0
  • P粉493534105

    P粉4935341052023-08-17 15:42:59

    要するに、.then を呼び出す順序が原因です。

    リーリー

    上記のコードでは、外部コンストラクターを入力し、外部関数をすぐに呼び出します。次に、内部 Promise を作成し、内部関数を呼び出します。内側の関数は「c」を記録し、外側の Promise を 3 に解決し、次に内側の Promise を 2 に解決します。

    つまり、この時点で解決された Promise は 2 つありますが、それらを使用しようとするコードはありません。

    リーリー

    内部 Promise の構築が完了したら、内部 Promise で .then を呼び出します。 Promise が解決されたため、実行するマイクロタスクがキューに入れられます。

    リーリー

    外部 Promise の構築が完了したら、外部 Promise で .then を呼び出します。 Promise が解決されたため、実行するマイクロタスクがキューに入れられます。

    これで、すべての同期コードの実行が完了しました。呼び出しスタックは空になり、マイクロタスクが実行を開始します。これらは先入れ先出しの順序で実行されるため、内部の Promise に関連するマイクロタスクが最初に実行され、レコード 2 になります。次に、残りのマイクロタスクを実行し、3 を記録します。

    返事
    0
  • キャンセル返事