Chaîne Angulaire $http appels correctement?
J'ai lu sur $q et de promesses de jours maintenant et j'ai l'impression de le comprendre...un peu. J'ai la situation suivante dans la pratique:
- $Requête http et vérifie si un appel peut être fait.
- Si le premier appel échoue, le retour "pas de données", si elle réussit, et dit d'un appel peut être fait, le deuxième appel est effectué, si ce n'est pas "pas de données". Si le second appel réussit, il renvoie les données, si ce n'est pas "pas de données". Il ressemble à ceci (environ, je l'ai simplifié pour l'idée générale, donc ne vous inquiétez pas les petites erreurs ici):
return $http.get (something) .then(function(allowedAccess){ if(allowedAccess){ return $http.get (somethingElse) .then( function(result){return {data:result} }, function(error){return {data:"n0pe"} } ) } else { return {data:"n0pe"} } }, function(){ return {data:"n0pe"} });
M'a dit d'utiliser $q ici. Je ne comprends pas vraiment comment ni pourquoi je le ferais. L' $http appels sont des promesses déjà.
Si il y a un moyen de faire plus propre, je ne la vois pas. Juste de me faire re-lecture de ce poster sur le sujet. Essentiellement, suis-je raté quelque chose /est-il une meilleure façon de le faire?
Edit: viens de re-lire un tutoriel sur le chaînage de promesses - il ne gère pas les échecs d'appel. Fondamentalement, l'affichage de ce qu'une diligence raisonnable.
Edit 2: C'est plus élaborée sur la théorie, je suis enquise, extrait du premier article:
C'est un exemple simple. Il devient vraiment puissant si votre alors() de rappel renvoie une autre promesse. Dans ce cas, la prochaine alors() n'est exécutée qu'une fois que la promesse se résout. Ce modèle peut être utilisé pour la série de requêtes HTTP, par exemple (où une demande dépend du résultat de la précédente):
Ce qui semble être de parler de chaînes comme ceci:
asyncFn1(1)
.then(function(data){return asyncFn2(data)})
.then(function(data){return asyncFn3(data)})
Donc, si je comprends bien cette une). Ne s'applique pas à moi parce que je n'ai pas de 3ème fonction. b). Pourrait s'appliquer à moi, si j'avais trois fonctions car bien que j'ai exécuter une instruction si à l'intérieur de la première tranche de la requête http, et seulement à l'intérieur de l'instruction si puis-je retourner une autre promesse. Donc, théoriquement, si j'avais trois async fonctions de la chaîne, j'aurais besoin de mettre mon instruction if à l'intérieur d'une promesse?
OriginalL'auteur VSO | 2015-09-13
Vous devez vous connecter pour publier un commentaire.
Promet vraiment aider avec le code de composition de prise d'appels asynchrones. En d'autres termes, ils vous permettent de composer votre code de manière similaire à la façon dont vous composez un synchrones série d'appels (avec l'utilisation de enchaînés
.then
s) et, comme si elle la synchronisation de code était dans untry
/catch
bloc (avec.catch
).Donc, imaginez que votre HTTP appels ont été blocage - la logique que vous avez ressemblerait donc:
Vous pouvez simplifier un peu:
Et qui pourrait se traduire à la version asynchrone de:
Au moins, c'est le raisonnement que vous pourriez appliquer lors de la rédaction d'un code avec des branches et des appels asynchrones.
Je ne dis pas que la version que j'ai présenté est optimal ou court - il est, cependant, plus SEC à cause d'une simple erreur de manipulation. Mais juste de réaliser que lorsque vous ne
.then(success, error)
c'est équivalent àtry
/catch
au cours de la précédente opération asynchrone - cela peut ou peut ne pas être nécessaire en fonction de votre situation spécifique.Ce que nous rejetant avec q$.reject() ici? Je suis familier avec l'aide de rejeter() sur un différés créés avec q$.reporter(). Ici, il est juste de rejeter le deuxième $http.appel? Mais n'est-ce pas, si l'instruction n'étant pas une promesse un problème? Très probablement, je suis juste en manque de quelque chose.
est équivalent à
throw
de la synchronisation du monde. C'est le refus de la promesse, il finira dans la.catch
plutôt que la prochaine.then
OriginalL'auteur New Dev
C'est de savoir comment je code ce genre de problème:
Oui, c'est très bien comme Nouveau Dev réponse, mais je voulais faire un point de l'extraction de la fonction à leurs propres blocs. Cela rend l'ensemble du code beaucoup plus lisible.
OriginalL'auteur Matt Way
$q, aide à réduire la pyramide des appels comme ceci:
Ce blog - http://chariotsolutions.com/blog/post/angularjs-corner-using-promises-q-handle-asynchronous-calls/ - offre un moyen propre de faire plusieurs requêtes HTTP. Avis le plus propre approche à l'aide de q$. Dans le cas où vous vous appuyant sur un seul point de terminaison HTTP à l'aide de votre méthode aurait été tout simplement parfait. Je dirais, est-ce que vous avez est très bien aussi; $q pourrait permettre une plus grande souplesse dans l'avenir.
Le blog décrit un service tout en utilisant $q et le code est plus propre.
Je suis un débutant avec des promesses aussi, afin de prendre cela avec un grain de sel.
$q.all
fonctionne lorsque les appels sont indépendants les uns des autresBon point, @NewDev. Je vous remercie.
OriginalL'auteur zedfoxus