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é?

27
demandé sur Šime Vidas 2011-11-10 04:14:43

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.

23
répondu Jeremy Banks 2011-11-10 00:24:34

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é.

2
répondu ElLocoCocoLoco 2013-12-18 09:33:48

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

0
répondu serkan 2015-11-12 09:18:52