Le fonctionnement d'un rappel différé est chaque fois que vous lui ajoutez un rappel, ce rappel est poussé vers un tableau. Ensuite, lorsque la méthode .resolve()
or .resolveWith()
est appelée sur l'objet différé, tous les .done()
rappels du tableau sont exécutés dans l'ordre.
Maintenant, nous pouvons voir ce qu'est un objet différé. Prenez l'exemple ci-dessous.
var deferred = $.Deferred();
var promise = deferred.promise();
Ce que nous avons maintenant est un objet différé, et l'objet promis de l'objet différé. L'objet différé a tout cependant l'objet de promesse n'a que les méthodes les mêmes méthodes que l'objet de la promesse, .done()
, .fail()
et .always()
qui sont utilisés pour ajouter des callbacks à l'objet différé pour chaque respectif event
. L'objet différé d'autre part a plusieurs autres méthodes, le plus important .resolve()
et .reject()
. Lorsque ces méthodes sont appelées sur l'objet différé, tous les rappels sont appelés. .resolve()
déclenche les rappels .done()
et .always()
tandis que la .reject()
méthode appelle .fail()
et rappelle .always()
.
Généralement, l'objet différé est conservé caché dans une portée privée et l'objet de promesse est renvoyé par la fonction afin que des rappels puissent y être placés. L'objet différé sera résolu plus tard, par exemple après qu'une requête ajax est terminée ou après le chargement d'une image, après un setTimeout, etc. Il est également important de réaliser qu'un objet différé ne peut être résolu qu'une seule fois. S'il est déjà résolu, ses rappels seront appelés immédiatement.
Voici un autre exemple, celui que j'utilise:
function loadImage(url) {
var def = $.Deferred(),
img = new Image();
$(img).on("load error",function(e){
if (e.type === "error") {
def.reject(url);
}
else {
def.resolve(url);
}
});
img.src = url;
// return the promise object so that callbacks can
// be defined on the deferred object.
return def.promise();
}
loadImage("foobar.jpg").done(function(){
alert("The image is loaded!");
}).fail(function(){
alert("The image failed to load!");
}).always(function(){
alert("This is always called!");
});
Pour plus d'informations sur la $.Deferred()
méthode de jQuery et les objets différés, visitez http://api.jquery.com/category/deferred-object/
Deferred
objets de jQuery ? S'agit-il de quelque chose de spécifique à Node.js?