JQuery 1.5+.
J'ai développé un $.ajaxQueue()
qui utilise le $.Deferred
, .queue()
et $.ajax()
pour renvoyer également un promesse qui est résolu lorsque la demande est terminée.
/*
* jQuery.ajaxQueue - A queue for ajax requests
*
* (c) 2011 Corey Frang
* Dual licensed under the MIT and GPL licenses.
*
* Requires jQuery 1.5+
*/
(function($) {
// jQuery on an empty object, we are going to use this as our Queue
var ajaxQueue = $({});
$.ajaxQueue = function( ajaxOpts ) {
var jqXHR,
dfd = $.Deferred(),
promise = dfd.promise();
// queue our ajax request
ajaxQueue.queue( doRequest );
// add the abort method
promise.abort = function( statusText ) {
// proxy abort to the jqXHR if it is active
if ( jqXHR ) {
return jqXHR.abort( statusText );
}
// if there wasn't already a jqXHR we need to remove from queue
var queue = ajaxQueue.queue(),
index = $.inArray( doRequest, queue );
if ( index > -1 ) {
queue.splice( index, 1 );
}
// and then reject the deferred
dfd.rejectWith( ajaxOpts.context || ajaxOpts,
[ promise, statusText, "" ] );
return promise;
};
// run the actual query
function doRequest( next ) {
jqXHR = $.ajax( ajaxOpts )
.done( dfd.resolve )
.fail( dfd.reject )
.then( next, next );
}
return promise;
};
})(jQuery);
jQuery 1.4
Si vous utilisez jQuery 1.4, vous pouvez utiliser la file d'attente d'animation sur un objet vide pour créer votre propre "file d'attente" pour vos requêtes ajax pour les éléments.
Vous pouvez même en tenir compte dans votre propre $.ajax()
remplacement. Ce plugin $.ajaxQueue()
utilise la file d'attente standard "fx" de jQuery, qui démarre automatiquement le premier élément ajouté si la file d'attente n'est pas déjà en cours d'exécution.
(function($) {
// jQuery on an empty object, we are going to use this as our Queue
var ajaxQueue = $({});
$.ajaxQueue = function(ajaxOpts) {
// hold the original complete function
var oldComplete = ajaxOpts.complete;
// queue our ajax request
ajaxQueue.queue(function(next) {
// create a complete callback to fire the next event in the queue
ajaxOpts.complete = function() {
// fire the original complete if it was there
if (oldComplete) oldComplete.apply(this, arguments);
next(); // run the next query in the queue
};
// run the query
$.ajax(ajaxOpts);
});
};
})(jQuery);
Exemple d'utilisation
Donc, nous avons un <ul id="items">
qui a des <li>
que nous voulons copier (en utilisant l'ajax !) dans le fichier <ul id="output">
// get each item we want to copy
$("#items li").each(function(idx) {
// queue up an ajax request
$.ajaxQueue({
url: '/echo/html/',
data: {html : "["+idx+"] "+$(this).html()},
type: 'POST',
success: function(data) {
// Write to #output
$("#output").append($("<li>", { html: data }));
}
});
});
démonstration de jsfiddle - Version 1.4
1 votes
La marée et le temps passent (comme @gnarf l'a fait remarquer) ... depuis la version 1.5, jQuery dispose de toute une série d'outils de gestion de l'environnement.
Deferred
les objets comprenantwhen()
qui conviennent parfaitement à cette situation. Voir : api.jquery.com/category/deferred-object et api.jquery.com/jQuery.when