Obtenez de l'état Angulaire différé?
Avec jQuery deferreds je suis habitué à être en mesure de vérifier l'état actuel comme ceci:
var defer = $.Deferred();
defer.state(); //Returns the state of the deferred, eg 'resolved'
Est-il un moyen de faire de même pour Angulaires deferreds? (ou encore mieux de promesses)
Vous devez vous connecter pour publier un commentaire.
Mise à jour:
En raison de la refonte de $q c'est maintenant possible, bien que non documenté:
Original:
Contrairement à la plupart des promesse bibliothèques (Bluebird,Q, lorsque, RSVP, etc), $q ne pas exposer synchrone de l'inspection de l'API.
Il n'y a pas de façon de le réaliser à partir de l'extérieur.
Vous devez appeler
.then
sur la promesse et le code de cette fonction à exécuter lorsque la promesse remplit.La réponse à votre question est: oui, il y a un moyen. Les autres réponses bien couvrir les limites inhérentes de la
$q
. Cependant, il est facile d'ajouter une propriété de l'etat à$q
à l'aide de la$fournir
de service de la fonction décorateur.Mettre cette décorateur à l'intérieur d'un
config
bloc, et tous les$q
instancié différés et promesse objets ont unestate
propriété avec la valeur en attendant, remplies, ou rejeté.Découvrez ce plunk
Sceptique?
En fait, ce n'est pas le cas.
$q
's d'originedefer()
constructeur est appelé exactement une fois. Il est simplement décoré avec des fonctionnalités supplémentaires par l'interne de la fixation d'un gestionnaire d'événement viathen
. [Notez qu'une autredefer
objet est instancié comme un résultat de la supplémentairesthen
de callback qui est créé automatiquement avec chaque différés objet... qui n'est pas étonnant, car c'est de cette façon angulaire fonctionne en interne.]Noter que ce code va décorer chaque différé (et donc
promise
objet) qui est créé par le$q
service. Cela signifie que une API qui utilise $q sera automatiquement décorées avec lestate
propriété. Donc, indépendamment de la façon dont vous utilisez$q
, que ce soit avec certaines API ou sur son propre, cette solution décore à la fois ladeferred
objet et lepromise
, et j'ai fourni le plunk pour le prouver.Production digne?
Cette approche est unité vérifiable, c'est garantie de ne pas briser toute application utilisant déjà
$q
, et il est flexible dans le sens que plus tard, vous pourrez ajouter d'autres décorateurs de$q
sans modifier l'ancienne(s)..then
directement sans les frais de cette solution (la création d'un rétroprojecteur et d'allouer un supplément de fermeture pour chaque promesse unique à travers Angulaire) les Promesses tardent à Anguleux comme il est (de mieux en mieux récemment).$q.defer
, et non pas chaque promesse est générée à partir de cette méthode. En particulier, lareject
,when
/resolve
, etall
de méthodes spécifiquement appelnew Promise()
en interne alors querace
appelsdefer
. La meilleure façon de traiter ce serait pour décorer le constructeur dePromise
, mais que l'ensemble de l'API est interne.Mis à jour à:
Malheureusement, cela ne semble pas comme son possible avec
$q
. Vous devez mettre ce code à l'intérieur de votrethen
méthode.Autres:
C'est pour le Q de la bibliothèque ne angulaire du
$q
mais similaires.Angulaire est inspiré par le
Q
bibliothèque, découvrez la source, n'est pas aussi effrayant. https://github.com/kriskowal/q/blob/v1/q.jsVous pouvez utiliser
myPromise.inspect().state
il y a['pending', 'rejected', 'fulfilled']
Vous avez aussi:
Découvrez ce JSfiddle et ouvrir la console pour connecté résultats.
http://jsfiddle.net/S6LzP/
Plus granulaire, en Regardant les
defer
fonction sur la ligne de 488:Surtout notamment la méthode et à très bas
deferred.notify
.Exemple d'utilisation:
Je fouettée en place une solution inspirée par Gil et Travis réponses, qui orne la Promesse du constructeur avec des méthodes plus proche de la Q mise en œuvre.
Noter que cette décoration s'appuie sur
Promise.$$state
. Cela a été construit Angulaire 1.6.4, et, théoriquement, devrait travailler tout le chemin jusqu'à 1.3.x, mais aucune garantie sur la ou les futures versions: