web-dev-qa-db-fra.com

Dans Angular rxjs, quand devrais-je utiliser `pipe` vs` map`

Je suis un peu dérouté par l'opérateur pipe par rapport à l'enchaînement de map. Les deux exemples ci-dessous sont-ils fonctionnellement équivalents? Quel est le but ou l'avantage de la fonction pipe?

const name = ajax
  .getJSON<{ name: string }>("/api/employees/alice")
  .pipe(
    retry(3, 1000),
    map(employee => employee.name),
    catchError(error => of(null))
  );

const name = ajax
  .getJSON<{ name: string }>("/api/employees/alice")
  .let(retry(3, 1000))
  .map(employee => employee.name)
  .catch(error => Rx.Observable.of(null));
50
MonkeyBonkey

La "nouvelle" façon, en utilisant pipe, est appelée Opérateurs de lettres opérateurs canalisables . La "vieille" manière, où vous chaînez des opérateurs, est appelée en utilisant des "opérateurs de patch".

À partir de la version 5.5, nous avons livré des "opérateurs raccordables", qui sont accessibles sous rxjs/operators (notez les "opérateurs" pluralisés). Celles-ci sont censées être une meilleure approche pour extraire uniquement les opérateurs dont vous avez besoin que les opérateurs "correctifs" trouvés dans rxjs/add/operator/*.

Il y avait quelques problèmes avec les opérateurs de correctifs . Ils peuvent également s'assurer que votre paquet produit à partir de votre code est plus petit. Il y a aussi d'autres avantages, voir le documentation qui le couvre assez bien.

Pour répondre à votre autre question, vos deux exemples de code sont fonctionnellement équivalents. Vous devez également utiliser les opérateurs pipeables sur les opérateurs de patch chaque fois que cela est possible.


De la documentation ( pour l'exhaustivité )

Les problèmes avec les opérateurs corrigés pour le chaînage de points sont les suivants:

  1. Toute bibliothèque qui importe un opérateur de correctif augmente le Observable.prototype pour tous les consommateurs de cette bibliothèque, créant ainsi des dépendances aveugles. Si la bibliothèque supprime leur utilisation, ils cassent inconsciemment tout le monde. Avec les pipeables, vous devez importer les opérateurs dont vous avez besoin dans chaque fichier dans lequel vous les utilisez.
  2. Les opérateurs corrigés directement sur le prototype ne sont pas "agaçables" par des outils tels que le rollup ou le webpack. Les opérateurs pipeables seront comme il s’agit simplement de fonctions extraites directement des modules.
  3. Les opérateurs non utilisés importés dans les applications ne peuvent pas être détectés de manière fiable par aucun type d’outil de construction ou de règle de protection. Cela signifie que vous pouvez importer scan, mais cesser de l'utiliser et il est toujours ajouté à votre paquet de sortie. Avec les opérateurs raccordables, si vous ne l'utilisez pas, une règle de la charpie peut le récupérer pour vous.
  4. La composition fonctionnelle est géniale. Construire vos propres opérateurs personnalisés devient beaucoup plus facile, et maintenant ils fonctionnent et ressemblent à tous les autres opérateurs de rxjs. Vous n'avez plus besoin d'étendre Observable ou de remplacer lift.
53
Igor