Quelle est la différence entre un objet différé et son propre objet promise?
Créons un simple objet différé:
defer = $.Deferred( function ( defer ) {
setTimeout( defer.resolve, 3000 );
});
L'objet différé ci-dessus sera dans l'état "en attente" pendant 3 secondes, puis passera à l'état "résolu" (à quel point tous les rappels qui lui sont liés seront invoqués).
Récupérons aussi la promesse de cet objet différé:
promise = defer.promise();
Maintenant, pour ajouter des rappels qui vont être invoqués une fois l'objet différé résolu, nous pouvons utiliser .done()
ou .then()
. Cependant, nous pouvons invoquer cette méthode les deux sur l'objet différé lui-même ou son propre objet promise.
defer.then( handler );
Ou
promise.then( handler );
Dans les deux cas, la fonction handler
sera appelée (après 3 secondes dans ce cas).
Si nous utilisons $.when
, nous pouvons à nouveau passer l'objet différé lui-même ou son objet promise:
$.when( defer ).then( handler );
Ou
$.when( promise ).then( handler );
Encore une fois, il n'y a pas de différence entre les deux lignes de code.
Démo en direct: http://jsfiddle.net/G6Ad6/
Donc, ma question est, puisque nous pouvons invoquer .then()
, .done()
, etc. sur l'objet différé lui-même et puisque nous pouvons passer cet objet différé dans $.when()
, à quoi sert .promise()
et récupérer l'objet promise? Quel est le but de l'objet promesse? Pourquoi cette redondance de fonctionnalité?
3 réponses
Il crée une copie "scellée" de la valeur différée, sans les méthodes .resolve()
et .reject()
. À partir de la documentation:
La méthode
deferred.promise()
permet à une fonction asynchrone d'empêcher un autre code d'interférer avec la progression ou l'état de sa requête interne.
Il est utilisé quand cela n'a pas de sens que la valeur soit modifiée. Par exemple, lorsque jQuery effectue une requête AJAX, il renvoie un objet promise. En interne, c'est .resolve()
une valeur pour l'original Deferred
objet, que l'utilisateur observe avec la promesse.
Lors de l'utilisation de la "promesse" d'un objet différé, les observateurs (objets en attente de résolution par exemple) n'ont pas d'accès direct à l'objet différé lui-même, donc ils ne peuvent pas appeler, par exemple, la méthode "Resolve" de ce différé. C'est un moyen de protéger L'original différé.
Avec différé, vous pouvez contrôler son état set
.
Quand il s'agit de la promesse, vous pouvez lire l'état et peut-être attacher un rappel. get