52

ajax 呼び出しの実行中に、ブラウザー ウィンドウでユーザーにアラートが表示されるとどうなるのだろうと思っていました。

たとえば、ajax 呼び出しがあるとします。

$.ajax({
    url: ...,
    type: GET/POST,
    ...
    success: function(data){
        console.log(data);
    },
    error: ...
});

完了するまでに長い時間がかかります (10 秒)。呼び出しが実行されている間、単純な JavaScript アラートがスローされます

alert("hello!");

たとえば、次の場合はどうなりますか。

  1. ajax 呼び出しの開始
  2. データをフェッチする ajax 呼び出し
  3. アラートが表示される
  4. ajax 呼び出しはデータを返します (アラート ウィンドウはまだ開いています!)

JS がシングル スレッドであることを知っているので、スクリプトの実行が停止することがわかっています。アラート ウィンドウが「時間内に」閉じられない場合、ajax 呼び出し/応答がどうなるか疑問に思っていました。

私が十分に明確であり、これが「ダミー」の質問ではないことを願っています. ありがとうございました

4

2 に答える 2

60

これを試して確認するのはそれほど難しいことではありませんが、答えは、アラートが優先され、実行の流れが滞るということです。

アラートを閉じると、アラートが開いている間に AJAX 要求が完了したと見なされ、success関数が処理 (またはerror関数) されます。

アラートが表示されている間、AJAX リクエストは引き続き実行されることに注意してください (アラートが開いている間、長時間実行される AJAX を処理できます)。ただし、アラートが閉じられるまで、スクリプトはリクエストの処理を続行できません。

これは実際の例です。アラートが閉じられるまで、データはコンソールに書き込まれないことに注意してください。

注意すべきもう 1 つの点は、アラートが閉じた後、AJAX 応答が処理される前に、スクリプトが関数の残りの部分 ( の直後のコードalert)を続行することです。これは、私が何を意味するかを示すのに役立ちます

于 2014-05-22T08:25:08.197 に答える
11

HTTP 要求は引き続き実行され、バックグラウンドで処理されます。

JS イベント ループがフリーになると、readystatechange ハンドラーが起動します。

その状態が true である間にイベント ループがビジーであったため、いくつかの中間の準備完了状態がスキップされる場合があります。

于 2014-05-22T08:26:19.850 に答える