10
votes

Attendez que l'appel Ajax (post) achète

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: xxx

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?


0 commentaires

4 Réponses :


2
votes

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();
                        });
                });
            });
        });
    });
});


1 commentaires

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)



16
votes

Vous pouvez simplement utiliser le .ajaxstop () événement qui incendie Lorsque tous les autres postes AJAX finissent, en supposant que vous ne faites aucune autre solution AJAX, comme ceci: xxx

.ajaxstop () incendies lorsque tous les demandes d'Ajax qui fonctionnent complètes, il ne tire donc que tout de ces messages sont retournés, JQuery conserve un compte en interne ( $. actif , $. Ajax.active dans jQuery 1.5) pour déterminer le nombre de demandes AJAX simultanées sont exceptionnels ... quand il revient à 0 cet événement incendie.

Cette approche vous permet de faire les autres soumissions de formulaire simultanément et faites la forme finale dès que possible après.


1 commentaires

Merci d'avoir mentionné $. Ajax.active à JQuery 1.5!



0
votes

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();
    });
});


3 commentaires

AJAXSTOP () tirer uniquement lorsque Toutes les demandes d'Ajax 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 sera un tableau vide, pas non défini :)


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 :)



5
votes

Vous pouvez toujours rendre tous les messages synchrones à l'aide de quelque chose comme xxx

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>


1 commentaires

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."