File d'attente des requêtes ajax à l'aide de jQuery.la file d'attente()
Je suis à l'aide de jQuery.file() pour la première fois et n'ont pas vraiment pris.
Quelqu'un pourrait s'il vous plaît signaler ce que je fais mal?
À la recherche dans firebug, je vois toujours mon POST demandes de tir en même temps donc je me demande si je vais appeler dequeue() dans le mauvais endroit.
Aussi - comment puis-je obtenir la longueur de la file?
La raison que j'ai besoin de faire la queue à ces demandes est qu'il obtient le feu sur clic d'un bouton. Et son possible pour l'utilisateur à cliquer sur plusieurs boutons en succession rapide.
Essayé de supprimer la base de la structure de mon code:
$("a.button").click(function(){
$(this).doAjax(params);
});
//method
doAjax:function(params){
$(document).queue("myQueueName", function(){
$.ajax({
type: 'POST',
url: 'whatever.html',
params: params,
success: function(data){
doStuff;
$(document).dequeue("myQueueName");
}
});
});
}
- Cette answerégalement sur StackOverflow, donne une série d'exemples, y compris son utilisation avec des appels ajax.
- Je n'ai vraiment essayer cette approche - mais je ne pouvais pas obtenir que cela fonctionne. Je vois qu'il n'utilise pas dequeue() et je me demandais si c'est peut-être mon problème?
- Je suppose que next() fait la même chose que la file d'attente?
- Yep, next() fait la même chose. Il est passé par la file d'attente logique lorsque votre fonction est appelée.
Vous devez vous connecter pour publier un commentaire.
Vous le problème, ici, c'est que
.ajax()
déclenche un système exécutant une requête Ajax. Cela signifie que,.ajax()
retourne immédiatement, sans blocage. Si votre file d'attente de l'fonctions, mais ils feront feu presque en même temps, comme vous l'avez décrit.Je ne pense pas que le
.queue()
est un bon endroit pour faire des requêtes ajax, c'est plus destiné pour l'utilisation defx methods
. Vous avez besoin d'un simple gestionnaire.C'est loin d'être parfaite, je veux juste démontrer que le chemin à parcourir. L'exemple ci-dessus pourrait être utilisé comme
ajaxManager.stop();
J'avais besoin de faire quelque chose de similaire donc pensé que je poste ma solution ici.
Fondamentalement, ce que j'ai est une page qui répertorie les projets sur des étagères qui tous ont des critères. J'ai voulu charger les rayons un par un plutôt que pour obtenir du contenu à l'utilisateur plus rapide qui ils pouvaient regarder, tandis que le reste de la charge.
Fondamentalement, je stocke l'ID de chaque étagère dans un tableau JS que j'utilise lors de l'appel de PHP.
Ensuite, j'ai créé une fonction récursive qui apparaît le premier indice du tableau à chaque fois son nom et à la demande de l'étagère pour le sauté id. Une fois que j'ai la réponse de la
$.get()
ou$.post()
selon la, je préfère utiliser je puis appeler la fonction récursive à partir de l'intérieur de la fonction de rappel.Voici une élaboration dans le code:
var id = shelves.pop();
. Ensuite, vous n'avez pas besoin de suivre une formation spécifique.shift()
;.shift()
fin, vous pourriez avoir utilisévar id = shelves.shift();
- Je utiliser ce code très simple pour garder les appels ajax de "dépasser" les uns des autres.
Si vous ne voulez pas la file d'attente pour gérer lui-même, vous pouvez simplement supprimer le
dequeue
à partir de la fonction et de l'appeler à partir d'une autre fonction.Pour obtenir la longueur de file d'attente, pour cet exemple, il serait:
J'avais besoin de faire cela pour un nombre inconnu d'appels ajax. La réponse a été de pousser chacun dans un tableau et ensuite utiliser:
var arr = []; arr.push($.get(...));
aurait le feu de l'OBTENIR appelez immédiatement?J'ai trouvé les solutions ci-dessus un peu compliqués, plus j'ai besoin de modifier la demande juste avant de l'envoyer (la mise à jour de nouvelles données jeton).
Alors j'ai mis ce un ensemble. Source: https://gist.github.com/2470554
vous pouvez étendre jQuery:
de l'utiliser ensuite comme:
bien sûr, vous pouvez utiliser l'une de l'autre $.ajax, comme les options de type de données, contentType, Type de données puisque nous sommes l'extension $.ajax
Une autre version de jAndy réponse, sans timer.
À Utiliser:
L'learn.jquery.com site ont un bon exemple trop:
J'ai également eu à le faire au sein d'une solution que j'ai eu et j'ai trouvé que je pouvais le faire de cette façon:
à l'aide de la
next()
de callback qui est passé dans la file d'attente de fonction, vous pouvez retirer de l'opération suivante. Donc en les mettant ensuite, les gestionnaires de l'ajax, vous pouvez effectivement faire les appels ajax asynchrone pour le navigateur et le rendu ou de la peinture au fil de l'navigateur, mais de les rendre synchrone ou sérialisé les uns aux autres.Voici un exemple de base. Dans l'exemple de violon. Cliquez sur le bouton une fois et attendre une seconde. Vous verrez que le temps de déclencheurs et de la seule opération qui se passe. Ensuite, cliquez sur le bouton aussi vite que vous le pouvez (ou plus rapide qu'une seconde) et vous verrez que toutes les fois que vous cliquez sur le bouton, les opérations sont mises en file d'attente, puis seulement après une attente d'une seconde, ils ont frappé la page et à la décoloration, l'un après l'autre.
La beauté de ceci est que si la file d'attente est déjà vidange, toutes les opérations que vous ajoutez à ça alors que c'est la vidange sont placés sur la fin et puis juste transformé le moment venu.
Voici ma solution, que j'utilise pour produire une file d'attente de demandes de certains jeu par navigateur.
Si quelque chose arrive, je cesser de cette file d'attente et terminer le travail avec un programme spécial d'dernière demande ou de nettoyage.
juste un autre exemple de multi threaded file de coureur que j'ai écrit pour nodejs. Vous pourriez adapter à jquery ou angulaire. Les promesses sont légèrement différents dans chaque API. J'ai utilisé ce modèle pour des choses comme l'extraction de tous les éléments de grandes listes de SharePoint par la création de plusieurs requêtes pour extraire toutes les données et de permettre 6 à la fois, pour éviter serveur imposées par la limitation des limites.
À l'aide d'un cadre qui fournit des observables de soutien tels que knockout.js vous pouvez mettre en œuvre une observation de la file d'attente qui, lorsqu'ils sont poussés sur le mettra à l'appel et d'un changement de processus le processus.
Un knock-out de la mise en œuvre serait la suivante:
Observer que nous profitons de la observables de nous dire quand il faut envoyer une requête ajax. Cette méthode peut être appliquée dans une forme plus généralisée.
Par exemple, imaginez que vous avez eu un coup de cartographie qui a récupéré beaucoup d'entrées mais vous avez besoin d'appeler un autre service par élément pour les enrichir, dire définir une valeur.