2009-03-20 14 views
0

J'ai un appel .ajax jQuery:Comment lancer un autre appel jQuery .ajax basé sur le résultat d'un appel initial .ajax?

$j.ajax({ 
     type: "POST", 
     url: "/Services/Cart.asmx/UpdateQuantity", 
     data: data, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function(msg) { 
      var d = msg.d; 

      // etc. 
     }, 
     error: function(xhr, msg) { 
      var response = JSON.parse(xhr.responseText); 
      var cart = $j('#cart'); 
      if (response.Message) { 
       cart.before(' <div class="error">' + response.Message + '</div> '); 
      } 
      else { 
       cart.before(' <div class="error">An unexpected error occurred.</div> '); 
      } 
     }, 
     complete: function(request, settings) { 
      // Some other stuff. 
     } 

    }); // end ajax 
    alert('Initially thought this would be called after above .ajax call complete. But it is not. Rather, it is called before success etc.') 

Cependant, sur la base des données renvoyées par ce premier appel ajax, je veux lancer un second appel .ajax. Il semble cependant que, en raison de la configuration des callbacks pour le premier, il ne se produit pas séquentiellement (c'est-à-dire dans la dernière ligne d'alerte ci-dessus ('Initialally ...'), donc je ne peux pas utiliser le dernières données DOM côté client mises à jour.

Comment est-il préférable d'envoyer un autre appel .ajax? J'ai rapidement fait quelques tests au sein de l'événement complet, mais cela ne semblait pas aller. J'ai "jQuery in Action" assis ici, attendant que je trouve le temps de creuser pour comprendre ce qui se passe sous le capot, mais pas encore!

MISE À JOUR: Erk. Lorsque l'évidence ne fonctionne pas comme prévu, le problème se situe généralement entre la chaise et le moniteur; Je vais mettre celui-ci à un pet de cerveau toute la nuit. Il s'est avéré très correct que je l'avais initialement configuré (appeler le deuxième appel .ajax dans le rappel de succès), mais mon deuxième appel .ajax avait une petite erreur de syntaxe (et donc a échoué et m'a envoyé dans le mauvais sens). Et @kgiannakakis est noté comme la réponse parce qu'il était a) premier et b) fourni le hilarement sous-estimé "Vous pouvez configurer l'appel pour être synchrone, mais ce n'est pas une technique recommandée."

Répondre

2

Eh bien l'alerte devrait aller dans le rappel de succès et non après l'appel ajax. Le comportement par défaut des appels ajax est asynchrone. C'est-à-dire que l'appel revient immédiatement et que les rappels sont appelés plus tard à un moment donné, lorsque les données sont effectivement reçues.

Vous pouvez configurer l'appel pour être synchrone, mais cette technique n'est pas recommandée.

3

Si vous souhaitez effectuer une autre requête ajax basée sur le résultat du premier, vous devriez probablement avoir la deuxième requête ajax dans une autre fonction. Cette autre fonction sera appelée sur l'événement de succès de la première requête ajax. Quelque chose comme ceci, bien que je n'ai pas testé ceci pour m'assurer qu'il est correct:

$j.ajax({ 
    type: "POST", 
    url: "/Services/Cart.asmx/UpdateQuantity", 
    data: data, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: newSuccessFunction(xhr,msg), 
    error: function(xhr, msg) { 
     var response = JSON.parse(xhr.responseText); 
     var cart = $j('#cart'); 
     if (response.Message) { 
      cart.before(' <div class="error">' + response.Message + '</div> '); 
     } 
     else { 
      cart.before(' <div class="error">An unexpected error occurred.</div> '); 
     } 
    }, 
    complete: function(request, settings) { 
     // Some other stuff. 
    } 

}); // end ajax 

function newSuccessFunction(xhr,msg) { 
    var d = msg.d; 
    //... etc. 
    $.ajax({ //... 
      }); 
    alert('Initially thought this would be called after above .ajax call complete. But it is not. Rather, it is called before success etc.') 
} 
Questions connexes