Quelle est la différence entre Promise
etObservable
dans Angular?
Un exemple sur chacun serait utile pour comprendre les deux cas. Dans quel scénario pouvons-nous utiliser chaque cas?
Quelle est la différence entre Promise
etObservable
dans Angular?
Un exemple sur chacun serait utile pour comprendre les deux cas. Dans quel scénario pouvons-nous utiliser chaque cas?
Réponses:
Promettre
A
Promise
gère un seul événement lorsqu'une opération asynchrone se termine ou échoue.Remarque: Il existe des
Promise
bibliothèques qui prennent en charge l'annulation, mais ES6Promise
ne le fait pas jusqu'à présent.Observable
Un
Observable
est comme unStream
(dans de nombreuses langues) et permet de passer zéro ou plusieurs événements où le rappel est appelé pour chaque événement.Il
Observable
est souvent préférable àPromise
car il offre les fonctionnalités dePromise
et plus encore. AvecObservable
cela n'a pas d'importance si vous souhaitez gérer 0, 1 ou plusieurs événements. Vous pouvez utiliser la même API dans chaque cas.Observable
a également l'avantagePromise
d'être annulable . Si le résultat d'une demande HTTP à un serveur ou d'une autre opération asynchrone coûteuse n'est plus nécessaire, leSubscription
d'unObservable
permet d'annuler l'abonnement, tandis qu'unPromise
appel finira par appeler le succès ou l'échec du rappel même lorsque vous n'avez pas besoin de la notification ou le résultat qu'il fournit.Observable fournit des opérateurs comme
map
,forEach
,reduce
, ... semblable à un tableauIl existe également des opérateurs puissants comme
retry()
, oureplay()
, ... qui sont souvent très pratiques.la source
Promise
, avecasync
/await
rend votre code à nouveau plat! Dans la majorité des situations, et dans les projets qui ne traitent pas de fusée, il n'est pas nécessaire d'écrire ces horribles fonctions imbriquées avec des chaînes de méthodes inutilement compliquées. Vous pouvez utiliserasync
/await
aujourd'hui avec des transpilers, commeTypeScript
et écrire du code plat lisible par l'homme sans aucun passe-rxjs
partout. Vous aurez probablement encore besoinrxjs
parfois dans certaines situations, car il a vraiment beaucoup de choses à offrir.Les deux
Promises
etObservables
nous fournissent des abstractions qui nous aident à gérer la nature asynchrone de nos applications. La différence entre eux a été clairement mise en évidence par @ Günter et @Relu.Puisqu'un extrait de code vaut mille mots, parcourez l'exemple ci-dessous pour les comprendre plus facilement.
Angular utilise Rx.js Observables au lieu de promesses pour traiter avec HTTP.
Supposons que vous créez une fonction de recherche qui devrait instantanément vous montrer les résultats que vous tapez. Cela vous semble familier, mais cette tâche comporte de nombreux défis.
HTTP
demandes. Fondamentalement, nous ne voulons le frapper qu'une fois que l'utilisateur a arrêté de taper au lieu de chaque frappe.La démo se composera simplement de deux fichiers:
app.ts
etwikipedia-service.ts
. Dans un scénario réel, nous diviserions très probablement les choses plus haut, cependant.Vous trouverez ci-dessous une implémentation basée sur Promise qui ne gère aucun des cas de bord décrits.
wikipedia-service.ts
Nous injectons le
Jsonp
service pour faire uneGET
demande contre l'API Wikipedia avec un terme de recherche donné. Notez que nous appelonstoPromise
pour passer d'unObservable<Response>
à unPromise<Response>
. Finalement, vous vous retrouvez avec unPromise<Array<string>>
comme type de retour de notre méthode de recherche.app.ts
Pas beaucoup de surprise ici non plus. Nous injectons notre
WikipediaService
et exposons sa fonctionnalité via une méthode de recherche au modèle. Le modèle se lie simplement à la saisie et aux appelssearch(term.value)
.Nous déroulons le résultat de la promesse que la méthode de recherche du WikipediaService renvoie et l'exposons comme un simple tableau de chaînes au modèle afin que nous puissions le
*ngFor
parcourir et créer une liste pour nous.Voir l'exemple d' implémentation basée sur Promise sur Plunker
Où les observables brillent vraiment
Modifions notre code pour ne pas marteler le point de terminaison à chaque frappe, mais envoyer une demande à la place uniquement lorsque l'utilisateur a arrêté de taper pendant 400 ms
Pour dévoiler ces super pouvoirs, nous devons d'abord obtenir un
Observable<string>
qui porte le terme de recherche que l'utilisateur tape. Au lieu de se lier manuellement à l'événement keyup, nous pouvons tirer parti de laformControl
directive d'Angular . Pour utiliser cette directive, nous devons d'abord importer leReactiveFormsModule
dans notre module d'application.app.ts
Une fois importé, nous pouvons utiliser formControl à partir de notre modèle et lui attribuer le nom "term".
Dans notre composant, nous créons une instance de
FormControl
from@angular/form
et l'exposons en tant que champ sous le terme de nom sur notre composant.Dans les coulisses, le terme expose automatiquement une
Observable<string>
propriété as àvalueChanges
laquelle nous pouvons souscrire. Maintenant que nous avons unObservable<string>
, surmonter l'entrée utilisateur est aussi simple que d'appelerdebounceTime(400)
notreObservable
. Cela retournera une nouvelleObservable<string>
qui n'émettra une nouvelle valeur que si aucune nouvelle valeur n'est venue depuis 400 ms.Ce serait une perte de ressources d'envoyer une autre demande de terme de recherche pour laquelle notre application affiche déjà les résultats. Tout ce que nous avons à faire pour obtenir le comportement souhaité est d'appeler l'
distinctUntilChanged
opérateur juste après avoir appelédebounceTime(400)
Voir l'exemple d' implémentation observable sur Plunker
Pour autant que j'utilise Http dans Angular, je conviens que dans les cas d'utilisation normaux, il n'y a pas beaucoup de différence lors de l'utilisation d'Observable sur Promise. Aucun des avantages n'est vraiment pertinent ici dans la pratique. J'espère que je pourrai voir un cas d'utilisation avancée à l'avenir :)
la source
Les promesses et les observables nous aideront à travailler avec les fonctionnalités asynchrones en JavaScript. Ils sont très similaires dans de nombreux cas, cependant, il y a encore des différences entre les deux, les promesses sont des valeurs qui se résoudront
asynchronous
comme des appels http . D'un autre côté, les observables traitent d'une séquence d' événements asynchrones . Les principales différences entre eux sont répertoriées ci-dessous:promettre:
observable:
Aussi, j'ai créé l'image graphique pour vous ci-dessous pour montrer les différences visuellement:
la source
Promise
est la mauvaise façon de penser à la façon dont les promesses. Il luiPromise
incombe uniquement de gérer le succès ou l'échec d'une manière compatible asynchrone. Si vous souhaitez annuler une demande http, vous annulez la demande, et non la promesse, et le résultat de l'annulation remplit ou rejette la promesse. jsfiddle.net/greggman/ea0yhd4pPromesses
Observables
Un opérateur retry peut être utilisé pour une nouvelle tentative en cas de besoin, même si nous devons recommencer l'observable en fonction de certaines conditions retryWhen peut être utilisé.
Remarque : Une liste des opérateurs avec leurs diagrammes interactifs est disponible ici sur RxMarbles.com
la source
Il y a un inconvénient d'Observables manquant dans les réponses. Les promesses permettent d'utiliser les fonctions asynchrones / en attente d'ES7. Avec eux, vous pouvez écrire du code asynchrone comme s'il s'agissait d'un appel de fonction synchrone, vous n'avez donc plus besoin de rappels. La seule possibilité pour Observables de le faire est de les convertir en promesses. Mais lorsque vous les convertissez en promesses, vous ne pouvez à nouveau avoir qu'une seule valeur de retour:
Pour en savoir plus: Comment puis-je «attendre» sur un Rx Observable?
la source
Promises et Observables gèrent uniquement l'appel asynchrone.
Voici les différences entre eux:
Observable
Promettre
N'émet qu'une seule valeur à la fois
Appelle les services sans .then et .catch
Ne peut être annulé
Ne fournit aucun opérateur
la source
Même si cette réponse est en retard, j'ai résumé les différences ci-dessous,
Observable:
function
qui prendan observer
et retourne unfunction Observer: an object with next, error.
subscribe/unsubscribe
son flux de données, d'émettre la valeur suivante à l'observateur, ànotify
l'observateurerrors
et à informer l'observateur de lastream completion
function to handle next value
, les erreurs et la fin du flux (événements ui, réponses http, données avec sockets Web).multiple values
fil du tempscancel-able/retry-able
et prend en charge les opérateurs tels quemap,filter,reduce
etc.Observable.create()
- renvoie Observable qui peut invoquer des méthodes -Observer Observable.from()
- convertit un tableau ou itérable en -Observable Observable.fromEvent()
- convertit un événement en Observable -Observable.fromPromise()
- convertit une promesse en Observable -Observable.range()
- retourne une séquence d'entiers dans la plage spécifiéePromesse :
Une promesse représente une tâche qui se terminera à l'avenir;
Les promesses deviennent
resolved by a value
;Les promesses sont rejetées par des exceptions;
Pas
cancellable
et ça revienta single value
Une promesse expose une fonction
(then)
-en retourne un nouveau
promise
;-permet à
attachment
celui qui sera exécuté sur la base destate
;-
handlers
doiventguaranteed
s'exécuter dansorder attached
;la source
Je viens de traiter un problème où les promesses étaient la meilleure solution, et je la partage ici pour quiconque tombe sur cette question au cas où cela serait utile (c'était exactement la réponse que je cherchais plus tôt):
Dans un projet Angular2, j'ai un service qui prend certains paramètres et renvoie une liste de valeurs pour remplir les menus déroulants d'un formulaire. Lorsque le composant de formulaire s'initialise, je dois appeler le même service plusieurs fois avec des paramètres différents pour définir un certain nombre de menus déroulants différents, mais si je mets simplement en file d'attente toutes les variables pour appeler le service, seule la dernière réussit et l'erreur de reste en dehors. Le service récupérant de la base de données ne pouvait gérer qu'une seule demande à la fois.
Le seul moyen de remplir avec succès toutes les variables du menu déroulant était d'appeler le service d'une manière qui empêchait le traitement d'une nouvelle demande jusqu'à la fin de la dernière demande, et le mécanisme Promise / .then a résolu le problème correctement.
J'ai défini les fonctions dans le composant, puis appelé initializeDropDowns () dans ngOnInit.
La fonction fetchValueList renvoie une promesse, donc le premier appel passe le premier listCode et lorsque la promesse se résout, la valeur de retour est dans la variable de données du bloc .then où nous pouvons l'affecter à la variable this.firstValList. Comme la fonction a renvoyé des données, nous savons que le service est terminé et qu'il est sûr d'appeler à nouveau avec le deuxième listCode, la valeur de retour est dans la variable de données dans le bloc .then suivant et nous l'affectons à la variable this.secondValList.
Nous pouvons enchaîner cela autant de fois que nécessaire pour remplir toutes les variables, et sur le dernier bloc de code, nous omettons simplement l'instruction return et le bloc se termine.
Il s'agit d'un cas d'utilisation très spécifique où nous avons un seul service qui doit être appelé plusieurs fois lors de l'initialisation du composant, et où le service doit terminer sa récupération et renvoyer une valeur avant de pouvoir être appelé à nouveau, mais dans ce cas, la méthode Promise / .then était idéale.
la source
scan()
pour construire un flux d'observables séquentiels. Cependant, votre approche est peut-être plus explicite et plus facile à comprendre.Je pense que toutes les autres réponses devraient dissiper vos doutes. Néanmoins, je voulais juste ajouter que les observables sont basés sur une programmation fonctionnelle, et je trouve très utiles les fonctions qui l'accompagnent comme map, flatmap, réduire, zip. La cohérence que le Web atteint, en particulier lorsqu'il dépend des demandes d'API, est une amélioration brutale.
Je recommande fortement cette documentation , car c'est la documentation officielle de reactiveX et je la trouve la plus claire qui soit.
Si vous voulez entrer dans les observables, je suggère ce post en 3 parties: http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/
Bien que cela soit destiné à RxJava, les concepts sont les mêmes, et c'est vraiment bien expliqué. Dans la documentation reactiveX, vous avez les équivalences pour chaque fonction. Vous devez rechercher RxJS.
la source
Promettre:
Observable:
Vous pouvez utiliser des promesses au lieu d'observables lorsque vous appelez HTTP en angulaire si vous le souhaitez.
la source
Aperçu:
Vous pouvez toujours utiliser un observable pour gérer le comportement asynchrone car un observable a toutes les fonctionnalités qu'une promesse offre (+ extra). Cependant, parfois, cette fonctionnalité supplémentaire qu'offre Observables n'est pas nécessaire. Il serait alors un surcoût supplémentaire d'importer une bibliothèque pour qu'elle puisse les utiliser.
Quand utiliser Promises:
Utilisez des promesses lorsque vous avez une seule opération asynchrone dont vous souhaitez traiter le résultat. Par exemple:
Ainsi, une promesse exécute du code où elle se résout ou rejette. Si la résolution ou le rejet est appelé, la promesse passe d'un état en attente à un état résolu ou rejeté . Lorsque l'état promis est résolu, la
then()
méthode est appelée. Lorsque l'état promis est rejeté, lacatch()
méthode est appelée.Quand utiliser Observables:
Utilisez Observables quand il y a un flux (de données) dans le temps que vous devez gérer. Un flux est une séquence d'éléments de données qui sont rendus disponibles au fil du temps . Voici des exemples de flux:
Dans l'Observable lui-même est spécifié lorsque l' événement suivant s'est produit, lorsqu'une erreur se produit ou lorsque l'Observable est terminé . Ensuite, nous pouvons souscrire à cet observable, qui l'active et dans cet abonnement, nous pouvons passer en 3 rappels (ne pas toujours avoir à passer en tout). Un rappel à exécuter pour réussir, un rappel pour erreur et un rappel pour terminer. Par exemple:
Lors de la création d'un observable, il nécessite une fonction de rappel qui fournit un observateur comme argument. Sur cet observateur, vous pouvez appeler
onNext
,onCompleted
,onError
. Ensuite, lorsque l'Observable est abonné, il appellera les rappels correspondants passés dans l'abonnement.la source
Promesse - Fournir une seule valeur future. Pas paresseux . Non annulable. Il rejettera ou résoudra.
Observable - Fournit une valeur future multiple. Paresseux . Annulable. Il fournit d'autres méthodes pour cartographier en direct, filtrer, réduire.
la source
Promesse vs similitude observable en premier
Exemple observable maintenant. Ici aussi, nous passons une fonction à observable, un observateur pour gérer la tâche asynchrone. Contrairement à résoudre dans la promesse, il a la méthode suivante et s'abonne à la place.
Les deux gèrent donc les tâches asynchrones. Voyons maintenant la différence.
Promesse vs différence observable
Promettre
Observable
la source
Below are some important differences in promises & Observables.
la source
Une promesse émet un seul événement lorsqu'une activité asynchrone se termine ou échoue.
Un observable est comme un flux (dans de nombreuses langues) et permet de passer au moins zéro ou plusieurs événements où le rappel est requis pour chaque événement.
Fréquemment observable est préféré à Promise car il donne les points forts de Promise et plus encore. Avec Observable, peu importe si vous devez gérer 0, 1 ou divers événements. Vous pouvez utiliser l'API similaire pour chaque cas.
Promesse: la promesse émet une seule valeur
Par exemple:
Observable: émet plusieurs valeurs sur une période de temps
Par exemple:
nous pouvons penser à un observable comme un flux qui émet plusieurs valeurs sur une période de temps et la même fonction de rappel est appelée pour chaque élément émis, donc avec un observable nous pouvons utiliser la même API pour gérer les données asynchrones. si ces données sont transmises en tant que valeur unique ou valeurs multiples sur une certaine période de temps.
Promettre:
Observable:
Promesses angulaires vs observables
la source
Promise émet une seule valeur tandis que Observable émet plusieurs valeurs. Ainsi, lors de la gestion d'une demande HTTP, Promise peut gérer une seule réponse pour la même demande, mais qu'en est-il s'il existe plusieurs réponses à la même demande, nous devons utiliser Observable. Oui, Observable peut gérer plusieurs réponses pour la même demande.
Promettre
Production
Observable
Production
la source
Promettre
Observable
Pour une meilleure compréhension, consultez le https://stackblitz.com/edit/observable-vs-promises
la source
Je vois beaucoup de gens utiliser l'argument selon lequel les observables sont "annulables" mais il est plutôt trivial de rendre Promise "annulable"
la source
Réponse courte :
Observable est meilleur , il a toutes les fonctionnalités Promises et des fonctionnalités supplémentaires.
Longue réponse:
Promesses:
Observable:
la source
Bien que la réponse acceptée soit bonne en général, je ne pense pas qu'elle souligne que lorsque vous traitez avec des composants angulaires, vous voulez presque toujours utiliser un observable car il prend en charge l'annulation. Les promesses ne peuvent pas être annulées et seront résolues même si votre composant est détruit. Angular a tendance à pardonner jusqu'à ce qu'il ne le soit pas.
Par exemple, toute détection de modification manuelle sur un composant détruit provoquera une exception:
Si votre composant est détruit avant la résolution de la promesse, vous obtiendrez une
attempt to use destroyed view
erreur lorsque la promesse sera résolue.Alternativement, si vous utilisez des observables avec le modèle takeUntil , dès que votre composant est détruit, l'abonnement sera annulé.
C'est un peu un exemple artificiel, mais l'exécution de code pour un composant qui est détruit va probablement conduire à des bugs. Sauf si vous voulez réellement le faire pour une raison quelconque: p
la source
Quelque chose que j'ai rencontré qui n'était pas apparent lors de la première lecture du tutoriel et des documents était l'idée de la multidiffusion.
Assurez-vous que par défaut, plusieurs abonnements déclencheront plusieurs exécutions dans un observable. Plusieurs abonnements à un seul appel HTTP Observable déclencheront plusieurs appels HTTP identiques, sauf si vous
.share()
(activez la multidiffusion).Une promesse vous oblige à traiter une chose à la fois, à déballer ses données, à gérer les exceptions, à prendre en charge les langues pour des choses sympas comme async / wait, et est assez simple sinon.
Un observable a beaucoup de cloches et de sifflets, mais vous devez comprendre le pouvoir avec lequel vous travaillez ou il peut être mal utilisé.
la source
Promettre:
An Async Event Handler - L'objet Promise représente l'achèvement (ou l'échec) éventuel d'une opération asynchrone et sa valeur résultante.
Syntaxe: new Promise (exécuteur);
Par exemple:
À propos de Promise: il possède un pipeline, il ne renverra donc de valeurs qu'une fois lors de son appel. son gestionnaire à sens unique donc une fois appelé, vous ne pourrez peut-être pas annuler. syntaxe utile que vous pouvez jouer, quand () et puis ()
Observables:
Les observables sont des collections paresseuses de plusieurs valeurs au fil du temps. c'est vraiment une excellente approche pour les opérations asynchrones. cela peut être fait avec rxjs qui a un support multiplateforme peut utiliser avec angular / react etc.
son acte comme stream liner. peut être multi-pipeline. donc une fois défini, vous pouvez vous abonner pour obtenir des résultats de retour dans de nombreux endroits.
Syntaxe:
import * as Rx from "@reactivex/rxjs";
à init:etc
s'inscrire:
RxLogger.getInstance();
Par exemple:
comme il prend en charge plusieurs pipelines, vous pouvez vous abonner à différents endroits, il a beaucoup de possibilités que de promesses.
Utilisation: il a plus de possibilités comme
map, filter, pipe, map, concatMap etc
la source
La différence fondamentale entre observable et promesse est:
la source
Les observables sont souvent comparés aux promesses. Voici quelques différences clés:
Les observables sont déclaratifs; le calcul ne démarre pas avant l'abonnement. Les promesses s'exécutent immédiatement à la création. Cela rend les observables utiles pour définir des recettes qui peuvent être exécutées chaque fois que vous avez besoin du résultat.
Les observables fournissent de nombreuses valeurs. Les promesses en fournissent un. Cela rend les observables utiles pour obtenir plusieurs valeurs au fil du temps.
Les observables différencient le chaînage et l'abonnement. Les promesses n'ont que des clauses .then (). Cela rend les observables utiles pour créer des recettes de transformation complexes à utiliser par d'autres parties du système, sans provoquer l'exécution du travail.
Observables subscribe () est responsable du traitement des erreurs. Les promesses poussent les erreurs vers les promesses de l'enfant. Cela rend les observables utiles pour la gestion centralisée et prévisible des erreurs.
C'est la différence la plus simple que vous puissiez trouver sur les documents ANGULAR.IO. la réponse au repos est donnée par la plupart est correcte à sa place
la source
Les promesses sont focalisées uniquement pour des valeurs uniques ou résolues, les observables sont des flux de données.
Les observables peuvent être annulés mais les promesses ne peuvent pas être annulées.
Le moins connu, du moins pour moi, c'est
la source
flux de valeurs (de 0 à plusieurs valeurs),
la source
Observables et Promises nous aident à travailler avec les fonctionnalités asynchrones en JavaScript / tapuscrit. Ils sont très similaires dans de nombreux cas, cependant, il existe encore des différences entre eux.
la source
Il y a déjà beaucoup de réponses sur ce sujet, donc je n'ajouterais pas de réponse redondante.
Mais à quelqu'un qui vient de commencer à apprendre Observable / Angular et se demande lequel utiliser comparer avec Promise , je vous recommande de garder tout Observable et de convertir toutes les promesses existantes de votre projet en Observable.
Tout simplement parce que le framework Angular lui-même et sa communauté utilisent tous Observable. Il serait donc avantageux lorsque vous intégrez des services-cadres ou des modules tiers et que vous enchaînez tout ensemble.
Bien que j'apprécie tous les downvotes, mais j'insiste toujours sur mon opinion ci-dessus, à moins que quelqu'un ne fasse un commentaire approprié pour répertorier quelques scénarios qui pourraient encore être utiles dans votre projet Angular pour utiliser Promises over Observables.
Bien sûr, aucune opinion n'est 100% correcte dans tous les cas, mais au moins je pense que 98% du temps pour les projets commerciaux réguliers mis en œuvre dans le cadre angulaire, Observable est la bonne voie à suivre.
Même si vous ne l'aimez pas au point de départ de votre projet de loisir simple, vous réaliserez bientôt presque tous les composants avec lesquels vous interagissez dans Angular, et la plupart des frameworks tiers Angular friendly utilisent Observables, puis vous a fini par convertir constamment votre Promesse en Observable afin de communiquer avec eux.
Ces composants incluent, mais sans s'y limiter: HttpClient, Form builder, Angular material modules / dialogs, Ngrx store / effects et ngx-bootstrap.
En fait, la seule promesse de l'écosystème angulaire que j'ai traitée au cours des 2 dernières années est
APP_INITIALIZER
.la source