J'utilise les onglets JQuery UI où chaque onglet a une forme différente dessus. Une fois que l'utilisateur entre dans diverses données, ils soumettent l'ensemble des onglets afin que chaque onglet publie sur le serveur de manière asynchrone. Cela fonctionne bien, et je n'ai aucun problème ici.
Cependant, où je rencontre un problème, c'est que, la dernière forme que je pose doit se produire après toutes les autres postes terminées. L'idée générale est comme ceci: p> La fonction de postform traite un peu de traitement et fait ensuite un appel AJAX $ .post. Le dernier $ .post effectué ici (à «Project / SaveProject») doit attendre que ces autres postes soient terminés. Quelle est la meilleure façon de faire ça? P> p>
4 Réponses :
Callbacks:
Définir Postform pour prendre un rappel: P>
postForm(0, "#Form1", function() { postForm(1, "#Form2", function() { postForm(2, "#Form3", function() { postForm(3, "#Form4", function() { $.post('Project/SaveProject', function (data) { $('<div class="save-alert">The current project has been saved.</div>') .insertAfter($('#tabs')) .fadeIn('slow') .animate({ opacity: 1.0 }, 3000) .fadeOut('slow', function () { $(this).remove(); }); }); }); }); }); });
Merci pour la réponse. J'avais initialement examiné cela, mais alors décidé que c'était un peu trop lourd de travailler avec. (+1)
Vous pouvez simplement utiliser le Cette approche vous permet de faire les autres soumissions de formulaire simultanément et faites la forme finale dès que possible après. p> p> .ajaxstop () code>
événement qui incendie Lorsque tous les autres postes AJAX finissent, en supposant que vous ne faites aucune autre solution AJAX, comme ceci: .ajaxstop () code>
incendies lorsque tous les demandes d'Ajax em> qui fonctionnent complètes, il ne tire donc que tout strong> de ces messages sont retournés, JQuery conserve un compte en interne ( $. actif code>,
$. Ajax.active code> dans jQuery 1.5) pour déterminer le nombre de demandes AJAX simultanées sont exceptionnels ... quand il revient à 0 cet événement incendie. p>
Merci d'avoir mentionné $. Ajax.active Code> à JQuery 1.5!
Le problème avec Ajaxstop est qu'il incendie chaque fois que tout ajax est terminé. Une alternative met en œuvre votre propre pile de méthodes comme ceci:
var stack = [] postForm(var1, var2){ stack.push(1); //Do postForm stuff stack.pop(); if (stack == undefined){ //Call the last post method } } postForm(0, "#Form1"); postForm(1, "#Form2"); postForm(2, "#Form3"); postForm(3, "#Form4"); $.post('Project/SaveProject', function (data) { $('<div class="save-alert">The current project has been saved.</div>') .insertAfter($('#tabs')) .fadeIn('slow') .animate({ opacity: 1.0 }, 3000) .fadeOut('slow', function () { $(this).remove(); }); });
AJAXSTOP () CODE> tirer uniquement lorsque Toutes les demandes d'Ajax i> AJAX complètes, et je l'incite la première fois qu'il fonctionne, pouvez-vous élaborer comment cela serait peut-être un problème? De plus, votre exemple ne fonctionnera pas, car
pile code> sera un tableau vide, pas
non défini code> :)
Je n'ai pas vu le trottoir au bas là-bas, s'excuser pour cela. Selon l'application, il peut y avoir beaucoup d'appels Ajax voler et dans des situations où vous avez besoin de contrôle absolu, je ferais ma propre pile d'appels pour mon flux de travail. Bien sûr, votre code fonctionne également (au moins s'il n'y a pas d'appels AJAX plus tôt dans l'application, où vous devriez définir le gestionnaire de la méthode Postform)
Je ne lie pas le gestionnaire avant que ce lot de demandes soit tiré sur :)
Vous pouvez toujours rendre tous les messages synchrones à l'aide de quelque chose comme bien sûr, il ne serait pas aussi rapide, mais cela résoudra votre problème si $ (document) .ajaxstop n'est pas une option < / p> p>
Cela ne fonctionne plus vraiment, il renvoie ce message: "Synchrone XMLHTTPRequest sur le thread principal est obsolète en raison de ses effets néfastes à l'expérience de l'utilisateur final."