2009-06-09 5 views
2

J'ai deux appels ajax simultanés sur la page. Je veux appeler une fonction quand les deux sont complets (et réussis).jquery ajax: fonction d'appel lorsque toutes les demandes sont terminées

Une solution inefficace:

  1. faire appel ajax A
  2. sur le succès de l'appel A, faire appel B
  3. sur le succès de l'appel B, appelez la fonction

Malheureusement, cela casse la concurrence.

N'importe quelle autre manière je peux accomplir le même effet?

Répondre

-1

une variable globale ajax_call_A_complete définir une autre varialbe globale ajax_call_B_complete définir ces deux varialbes false

Pas make ajax appelle en même temps. Dans le rappel de succès des deux appels ajax définir le varialbes à true. Je veux dire ajax_call_A_complete à ajax_call_A_complete à true et ajax call B met varialbe ajax_call_B_complete à true.

Définir un temps périodique qui vérifie la valeur de ces deux variables toutes les 2 secondes. Lorsque les deux variables sont vraies, déclenchez votre tâche dépendante.

+0

En supposant qu'il est impossible de définir ces drapeaux dans tout autre endroit, un Un événement de rappel simple fonctionne beaucoup mieux qu'une minuterie. –

+0

Une variante pourrait être d'utiliser une fonction qui serait invoquée à l'achèvement A et B. Cette fonction définirait les variables globales, en fonction de l'appel qui l'invoquait, puis vérifierait si les deux variables sont vraies. Si c'est le cas, alors il déclencherait la fonction désirée. Je pense que c'est mieux que d'avoir une fonction qui devient active toutes les 2 secondes. – Alexandre

0
var isASuccessful = false; 
var isBSuccessful = false; 
function callARequest() { 
    $.get("path/to/url", { params: list }, function() { 
     isASuccessful = true; 
     if (isBSuccessful) { 
      callMeAfterAandB(); 
     } else { 
      callBRequest(); 
     } 
    }); 
} 
function callBRequest() { 
    $.get("path/to/other/url", { params: list }, function() { 
     isBSuccessful = true; 
     if (isASuccessful) { 
      callMeAfterAandB(); 
     } else { 
      callARequest(); 
     } 
    }); 
} 
function callMeAfterAandB() { 
    // todo: something 
} 
1

Jetez un oeil à this answer I gave to pretty much the same question l'autre jour, et aussi jeter un oeil à the demo j'ai créé pour aller avec elle (voir la source sur cette page pour voir le code complet). Il est beaucoup plus une utilisation efficace des capacités inhérentes de JavaScript et la nature globale comme langue de déblayage au sujet des variables de drapeau, à mon humble avis ;-)

1
$(document).ajaxStop(function() { 
     //do your JQuery stuff; 
}); 
Questions connexes