89 votes

Meilleur moyen d'importer un Observable depuis rxjs

Dans mon application angulaire 2, j'ai un service qui utilise la fonction Observable de la classe rxjs bibliothèque.

import { Observable } from 'rxjs';

Pour le moment, j'utilise simplement Observable afin que je puisse utiliser le toPromise() fonction.

J'ai lu quelque part dans une autre question StackOverflow que l'importation de cette manière et également l'importation à partir de rxjs/Rx importera tout un tas de choses inutiles de l'Union européenne. rxjs qui augmentera le temps de chargement des pages et/ou la base de code.

Ma question est la suivante : quelle est la meilleure façon d'importer Observable afin que je puisse utiliser le toPromise() sans devoir importer tout le reste ?

2 votes

import {Observable} from 'rxjs/Observable'; importerait l'Observable, mais vous n'avez pas besoin de tout importer si vous utilisez des promesses... toPromise fonctionne sans elle.

0 votes

Qu'est-ce que je devrais importer par lui-même pour utiliser seulement toPromise ? J'utilise Observable, j'aurais dû le préciser dans la question. Il s'agit en fait de deux questions distinctes.

2 votes

Alors ceci fera l'affaire, si vous voulez des promesses import 'rxjs/add/operator/toPromise'; Jetez un coup d'œil à angular.io/docs/ts/latest/tutorial/toh-pt6.html Cela devrait vous aider :)

148voto

Vamshi Points 5473

Rxjs v 6.*

Il a été simplifié avec la nouvelle version de rxjs.

1) Opérateurs

import {map} from 'rxjs/operators';

2) Autres

import {Observable,of, from } from 'rxjs';

Au lieu de chaînage, nous avons besoin de pipe. Par exemple

Ancienne syntaxe :

source.map().switchMap().subscribe()

Nouvelle syntaxe :

source.pipe(map(), switchMap()).subscribe()

Note : Certains opérateurs changent de nom en raison de collisions de noms avec des mots réservés JavaScript ! Il s'agit notamment de :

do -> tap ,

catch -> catchError

switch -> switchAll

finally -> finalize


Rxjs v 5.*

J'écris cette réponse en partie pour m'aider moi-même, car je ne cesse de consulter la documentation chaque fois que j'ai besoin d'importer un opérateur. Faites-moi savoir si quelque chose peut être mieux fait.

1) import { Rx } from 'rxjs/Rx' ;

Cela importe toute la bibliothèque. Vous n'avez donc pas à vous soucier du chargement de chaque opérateur. Mais vous devez ajouter Rx. J'espère que le tree-shaking optimisera et choisira uniquement les fonctions nécessaires (à vérifier). Comme mentionné dans les commentaires, le secouage des arbres ne peut pas aider. Ce n'est donc pas une solution optimisée.

public cache = new Rx.BehaviorSubject('');

Ou vous pouvez importer individuel opérateurs .

Cela optimisera votre application pour n'utiliser que ces fichiers. :

2) import { _______ } from 'rxjs/_________';

Cette syntaxe est généralement utilisée pour les objets principaux tels que Rx lui-même ou Observable etc,

Les mots-clés qui peuvent être importés avec cette syntaxe

 Observable, Observer, BehaviorSubject, Subject, ReplaySubject

3) import 'rxjs/add/observable/__________';

Mise à jour pour Angular 5

avec Angular 5, qui utilise rxjs 5.5.2+.

import { empty } from 'rxjs/observable/empty';
import { concat} from 'rxjs/observable/concat';

Ils sont généralement accompagnés d'Observable directement. Par exemple

Observable.from()
Observable.of()

D'autres mots-clés de ce type peuvent être importés à l'aide de cette syntaxe :

concat, defer, empty, forkJoin, from, fromPromise, if, interval, merge, of, 
range, throw, timer, using, zip

4) import 'rxjs/add/operator/_________';

Mise à jour pour Angular 5

avec Angular 5, qui utilise rxjs 5.5.2+.

import { filter } from 'rxjs/operators/filter';
import { map } from 'rxjs/operators/map';

Ils arrivent généralement dans le flux après la création de l'Observable. Comme flatMap dans cet extrait de code :

Observable.of([1,2,3,4])
          .flatMap(arr => Observable.from(arr));

D'autres mots-clés de ce type utilisent cette syntaxe :

audit, buffer, catch, combineAll, combineLatest, concat, count, debounce, delay, 
distinct, do, every, expand, filter, finally, find , first, groupBy,
ignoreElements, isEmpty, last, let, map, max, merge, mergeMap, min, pluck, 
publish, race, reduce, repeat, scan, skip, startWith, switch, switchMap, take, 
takeUntil, throttle, timeout, toArray, toPromise, withLatestFrom, zip

FlatMap : flatMap est un alias de mergeMap Nous devons donc importer mergeMap à utiliser flatMap .


Note pour /add importations :

Nous n'avons besoin d'importer qu'une seule fois dans tout le projet. Il est donc conseillé de le faire à un seul endroit. S'ils sont inclus dans plusieurs fichiers, et que l'un d'entre eux est supprimé, la construction échouera pour de mauvaises raisons.

3 votes

L'arborescence ne peut pas être optimisée ici car elle repose sur les noms de symboles des définitions d'exportation et d'importation et les modules opérateurs RxJS n'exportent rien, mais modifient l'état global à la place. voir

0 votes

Je pense que vous devez importer chaque opérateur un par un comme import { map } from 'rxjs/operators/map } ; import { filter } from 'rxjs/operators/filter }

0 votes

GroupBy n'a pas fonctionné pour moi sous Angular 5+, mais d'autres l'ont fait.

22voto

Enn Points 1562

Mise à jour pour RxJS 6 (avril 2018)

Il est maintenant parfaitement possible d'importer directement à partir de rxjs . (Comme on peut le voir dans Angular 6+). Importation depuis rxjs/operators convient également et il n'est plus possible d'importer des opérateurs de manière globale (l'une des principales raisons du remaniement de l'interface de l'utilisateur). rxjs 6 et la nouvelle approche utilisant pipe ). Grâce à cela, le treeshaking peut maintenant être utilisé également.

Exemple de code provenant du dépôt rxjs :

import { Observable, Subject, ReplaySubject, from, of, range } from 'rxjs';
import { map, filter, switchMap } from 'rxjs/operators';

range(1, 200)
  .pipe(filter(x => x % 2 === 1), map(x => x + x))
  .subscribe(x => console.log(x));

Rétrocompatibilité pour rxjs < 6 ?

L'équipe rxjs a publié une paquet de compatibilité sur npm qui est à peu près installable et jouable. Avec cela, tous vos rxjs 5.x Le code devrait s'exécuter sans problème. Ceci est particulièrement utile lorsque la plupart des dépendances (c'est-à-dire les modules pour Angular) ne sont pas encore mises à jour.

0 votes

J'avais le problème dans Angular 6.0.0-rc.5. Et je ne savais pas que c'était RxJS qui avait fait le changement. J'ai également retiré le filtre du tuyau.

0 votes

Il y a beaucoup de changements dans RxJS6. Nous vous recommandons vivement de prendre le temps de lire ceci github.com/ReactiveX/rxjs/blob/master/MIGRATION.md et/ou auth0.com/blog/whats-new-in-rxjs-6 pour que tu puisses te préparer à RxJs7 où les choses vont vraiment disparaître. Comme @enn l'a mentionné, vous devriez maintenant utiliser pipe au lieu d'enchaîner les méthodes

0 votes

Cet article est excellent pour expliquer les avantages de pipe gofore.com/fr/opérateurs-locatifs-et-rxjs-versioning (il ne concerne pas spécifiquement la version 6 mais m'a aidé à comprendre pourquoi tant de changements drastiques dans RxJS6 qui ne sont pas bien expliqués dans leur propre guide).

3voto

Simon_Weaver Points 31141

Une chose que j'ai apprise à la dure est d'être cohérent.

Attention aux mélanges :

 import { BehaviorSubject } from "rxjs";

avec

 import { BehaviorSubject } from "rxjs/BehaviorSubject";

Cela fonctionnera probablement très bien jusqu'à ce que vous essayiez de passer l'objet à une autre classe (où vous l'avez fait de l'autre façon) et alors cela peut échouer.

 (myBehaviorSubject instanceof Observable)

Elle échoue parce que la chaîne de prototypes sera différente et qu'elle sera fausse.

Je ne prétends pas comprendre exactement ce qui se passe, mais il m'arrive de rencontrer ce problème et de devoir passer au format plus long.

0 votes

Si quelqu'un peut mieux expliquer cela, veuillez répondre :-)

0 votes

Visual Studio, par exemple, se contentera d'importer de "rxjs" et fusionner les définitions lorsqu'il semble préférable de les faire séparément dans le format "long".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X