web-dev-qa-db-fra.com

jQuery Attendez la fin des appels async. ajax

Bonjour, j'ai 2 appels ajax dans mon script, j'ai besoin qu'ils fonctionnent asynchrone pour gagner du temps, mais j'ai besoin de la seconde pour attendre que le premier soit terminé.

$.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");
        }
        });

Alors des idées? Merci

12
user1352324

Si vous utilisez jQuery 1.5+, vous pouvez utiliser jQuery.when() pour accomplir cela. Quelque chose comme (abrégé les appels ajax à la brièveté, il suffit de passer les objets comme vous le faites ci-dessus)

$.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 ]
});

Vous ne savez pas dans quel ordre ils renverront, donc si vous le faites à la main, vous devrez vérifier l'état de l'autre demande et attendre son retour.

16
Russ Cam

En utilisant 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

Vous devez câbler le deuxième appel pour qu'il soit contenu dans le rappel de votre premier appel ajax. Ainsi:

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

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

Comme JavaScript ne s'exécute pas dans plusieurs threads du client, vous ne pouvez pas bloquer le thread tant que certaines conditions ne sont pas remplies.

1
Tejs

Voici une autre réponse sur l'exécution de requêtes dual ajax. Comme Tejs, l'utilisateur passe un appel ajax dans la méthode de réussite ...

L'affiche indique qu'il est préférable que la méthode de succès lance une nouvelle demande ajax .. "

Avoir deux appels $ .ajax () dans un script

0
latoyale