web-dev-qa-db-ja.com

ajax通話中にアラートウィンドウが表示された場合はどうなりますか?

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の呼び出し/応答はどうなるのでしょうか。

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

52
BeNdErR

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

アラートを閉じ、アラートが開いている間にAJAXリクエストが完了したと仮定すると、success関数(またはerror関数)が処理されます。

AJAXリクエストはアラートが表示されている間も実行され続けます(したがって、長時間実行されているAJAXはアラートが開いている間処理できます))が、アラートが閉じられるまで、スクリプトがリクエストの処理を続行できないというだけです。

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

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

60
musefan

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

JSイベントループが解放されると、readystatechangeハンドラーが起動します。

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

11
Quentin