web-dev-qa-db-ja.com

jQuery非同期ajax呼び出しが終了するまで待つ

こんにちは私はスクリプトに2つのajax呼び出しがあります。時間を空けるために非同期で実行する必要がありますが、最初の呼び出しが終了するまで2番目の呼び出しを待つ必要があります。

$.ajax({
        type: "POST",
        url: "getText.asmx/ws_getText",
        data: parO1,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (msg) {
            alert(msg.d.data);
        }
        , error: function () {
            chyba("chyba v požadavku", "df");
        }
    });
    if (parO2.length > 0) {
        $.ajax({
            type: "POST",
            url: "getText.asmx/ws_getText",
            data: parO2,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (msg) {
                /*WAIT UNTIL THE FIRST CALL IS FINISHED AND THAN DO SOMETHING*/
            }
        , error: function () {
            chyba("chyba v požadavku", "df");
        }
        });

だから何かアイデアはありますか?ありがとう

12
user1352324

JQuery 1.5以降を使用している場合は、 jQuery.when() を使用してこれを実現できます。のようなもの(ajaxの呼び出しを短くして簡潔にする、上記のようにオブジェクトを渡すだけ)

$.when($.ajax("getText.asmx/ws_getText"), 
       $.ajax("getText.asmx/ws_getText")).done(function(a1,  a2){

   // a1 and a2 are arguments resolved for the 
   // first and second ajax requests, respectively
   var jqXHR = a1[2]; // arguments are [ "success", statusText, jqXHR ]
});

返される順序がわからないため、これを手動でロールしている場合は、他のリクエストの状態を確認して、返されるまで待つ必要があります。

16
Russ Cam

Jqueryの使用

$.ajax({
        type: "POST",
        async:false, // ** CHANGED **
        url: "getText.asmx/ws_getText",
        data: parO1,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (msg) {
            alert(msg.d.data);
        }
        , error: function () {
            chyba("chyba v požadavku", "df");
        }
    });
1
user3673557

最初のajax呼び出しのコールバックに含まれるように、2番目の呼び出しを接続する必要があります。そのようです:

success: function(msg)
{
    alert(msg.d.data);

    if(par02.length > 0)
    {
        // Your 2nd ajax call
    }
},

JavaScriptはクライアント上の複数のスレッドで実行されないため、特定の条件が満たされるまでスレッドをブロックすることはできません。

1
Tejs

デュアルajaxリクエストの実行に関する別の回答があります。 Tejsと同様に、ユーザーはsuccessメソッド内でajax呼び出しを行います...

ポスターは、successメソッドに新しいajaxリクエストを起動させる方がよいと述べています。」

1つのスクリプトで2つの$ .ajax()呼び出しを行う

0
latoyale