jQuery 1.5 apporte le nouvel objet Deferred et les méthodes associées .when
, .Deferred
et ._Deferred
.
Pour ceux qui ne l'ont pas utilisé .Deferred
auparavant, j'ai annoté la source de celui-ci .
Quels sont les usages possibles de ces nouvelles méthodes, comment procéder pour les adapter à des motifs?
J'ai déjà lu l' API et la source , donc je sais ce que ça fait. Ma question est de savoir comment utiliser ces nouvelles fonctionnalités dans le code de tous les jours?
J'ai un exemple simple d'une classe tampon qui appelle la demande AJAX dans l'ordre. (Début suivant après fin du précédent).
/* Class: Buffer
* methods: append
*
* Constructor: takes a function which will be the task handler to be called
*
* .append appends a task to the buffer. Buffer will only call a task when the
* previous task has finished
*/
var Buffer = function(handler) {
var tasks = [];
// empty resolved deferred object
var deferred = $.when();
// handle the next object
function handleNextTask() {
// if the current deferred task has resolved and there are more tasks
if (deferred.isResolved() && tasks.length > 0) {
// grab a task
var task = tasks.shift();
// set the deferred to be deferred returned from the handler
deferred = handler(task);
// if its not a deferred object then set it to be an empty deferred object
if (!(deferred && deferred.promise)) {
deferred = $.when();
}
// if we have tasks left then handle the next one when the current one
// is done.
if (tasks.length > 0) {
deferred.done(handleNextTask);
}
}
}
// appends a task.
this.append = function(task) {
// add to the array
tasks.push(task);
// handle the next task
handleNextTask();
};
};
Je recherche des démonstrations et des utilisations possibles de .Deferred
et .when
.
Il serait également agréable d'en voir des exemples ._Deferred
.
Lier à la nouvelle jQuery.ajax
source d'exemples est de la triche.
Je suis particulièrement intéressé par les techniques disponibles lorsque nous résumons si une opération est effectuée de manière synchrone ou asynchrone.
._Deferred
est tout simplement le véritable "objet différé" qui .Deferred
utilise. C'est un objet interne dont vous n'aurez probablement jamais besoin.