Angular2 http.get(),map(), abonnez-vous() et observables modèle de base de la compréhension

maintenant, j'ai une page initiale où j'ai trois liens. Une fois que vous cliquez sur le dernier "amis" lien approprié amis Composant est initié. Là, Je veux chercher / obtenir la liste de mes amis strorred dans les amis.fichier json. Jusqu'à maintenant tout fonctionne très bien. Mais je suis toujours un internaute novice pour le service HTTP d'angular2 en utilisant le concept observables, map, subscribe de RxJs. J'ai essayé de le comprendre et de lire quelques articles, mais jusqu'à ce que je commence à travailler, Je ne vais pas comprendre ces concepts. correctement.

ici, j'ai déjà fait plnkr qui fonctionne à l'exception du travail lié au HTTP.

Plnkr

myfriends.ts

 import {Component,View,CORE_DIRECTIVES} from 'angular2/core';
 import {Http, Response,HTTP_PROVIDERS} from 'angular2/http';
 import 'rxjs/Rx';
 @Component({
    template: `
    <h1>My Friends</h1>
    <ul>
      <li *ngFor="#frnd of result">
          {{frnd.name}} is {{frnd.age}} years old.
      </li>
    </ul>
    `,
    directive:[CORE_DIRECTIVES]
  })

  export class FriendsList{

      result:Array<Object>; 
      constructor(http: Http) { 
        console.log("Friends are being called");

       // below code is new for me. So please show me correct way how to do it and please explain about .map and .subscribe functions and observable pattern.

        this.result = http.get('friends.json')
                      .map(response => response.json())
                      .subscribe(result => this.result =result.json());

        //Note : I want to fetch data into result object and display it through ngFor.

       }
  }

veuillez guider et expliquer correctement. Je sais que ce sera bénéfique pour beaucoup de nouveaux développeurs.

149
demandé sur nyks 2016-01-08 10:35:39

3 réponses

voici où vous vous êtes trompé:

this.result = http.get('friends.json')
                  .map(response => response.json())
                  .subscribe(result => this.result =result.json());

il devrait être:

http.get('friends.json')
                  .map(response => response.json())
                  .subscribe(result => this.result =result);

ou

http.get('friends.json')
                  .subscribe(result => this.result =result.json());

vous avez fait deux erreurs:

1-vous avez assigné l'observable lui-même à this.result . Quand vous avez réellement voulu assigner la liste d'amis à this.result . La bonne façon de le faire est:

  • observable. .subscribe est la fonction qui exécute des observables. Il prend trois paramètres de rappel comme suit:

    .subscribe(success, failure, complete);

par exemple:

.subscribe(
    function(response) { console.log("Success Response" + response)},
    function(error) { console.log("Error happened" + error)},
    function() { console.log("the subscription is completed")}
);

habituellement, vous prenez les résultats de l'appel de succès et l'assignez à votre variable. l'erreur de rappel est auto-explicatif. la complète rappel est utilisé pour déterminer que vous avez reçu les derniers résultats sans erreurs. sur votre plunker, le rappel complet sera toujours appelé après le succès ou l'erreur de rappel.

2 - la deuxième erreur, vous avez appelé .json() sur .map(res => res.json()) , puis vous l'avez appelé à nouveau sur le succès callback de l'observable. .map() est un transformateur qui transformera le résultat en quoi que vous retourniez (dans votre cas .json() ) avant qu'il ne soit passé au succès callback vous devriez appelé une fois sur l'un d'eux.

188
répondu Abdulrahman 2017-09-15 20:18:05

Concepts

Observables à court aborde le traitement asynchrone et les événements. En comparant avec les promesses, on pourrait décrire cela comme observables = promesses + événements.

ce qui est génial avec les observables est qu'ils sont paresseux, ils peuvent être annulés et vous pouvez appliquer certains opérateurs en eux (comme map ,...). Cela permet de gérer les choses asynchrones d'une manière très flexible.

A grand échantillon décrivant le meilleur la puissance des observables est la façon de connecter une entrée de filtre à une liste filtrée correspondante. Lorsque l'utilisateur saisit des caractères, la liste est actualisée. Les Observables traitent les requêtes AJAX correspondantes et annulent les précédentes requêtes en cours Si une autre est déclenchée par une nouvelle valeur dans l'entrée. Voici le code correspondant:

this.textValue.valueChanges
    .debounceTime(500)
    .switchMap(data => this.httpService.getListValues(data))
    .subscribe(data => console.log('new list values', data));

( textValue est la commande associée à l'entrée du filtre).

Voici une description plus large de ce cas d'utilisation: comment surveiller les changements de forme dans L'angle 2? .

il y a deux grandes présentations à AngularConnect 2015 et EggHead:

Christoph Burgdorf a également écrit quelques grands billets de blog sur le sujet:

en action

en fait concernant votre code, vous avez mélangé deux approches ; -) voici elles:

  • gérez l'observable par votre propre . Dans ce cas, vous êtes responsable d'appeler la méthode subscribe sur l'observable et d'assigner le résultat dans un attribut du composant. Vous pouvez ensuite utiliser cet attribut dans la vue pour parcourir la collection:

    @Component({
      template: `
        <h1>My Friends</h1>
        <ul>
          <li *ngFor="#frnd of result">
            {{frnd.name}} is {{frnd.age}} years old.
          </li>
        </ul>
      `,
      directive:[CORE_DIRECTIVES]
    })
    export class FriendsList implement OnInit, OnDestroy {
      result:Array<Object>; 
    
      constructor(http: Http) {
      }
    
      ngOnInit() {
        this.friendsObservable = http.get('friends.json')
                      .map(response => response.json())
                      .subscribe(result => this.result = result);
       }
    
       ngOnDestroy() {
         this.friendsObservable.dispose();
       }
    }
    

    retourne des méthodes get et map ne sont pas le résultat observable (de la même manière qu'avec des promesses).

  • laisser gérer l'observable par le gabarit angulaire . Vous pouvez également utiliser le tuyau async pour gérer implicitement l'observable. Dans ce cas, il n'est pas nécessaire d'appeler explicitement la subscribe la méthode.

    @Component({
      template: `
        <h1>My Friends</h1>
        <ul>
          <li *ngFor="#frnd of (result | async)">
            {{frnd.name}} is {{frnd.age}} years old.
          </li>
        </ul>
      `,
      directive:[CORE_DIRECTIVES]
    })
    export class FriendsList implement OnInit {
      result:Array<Object>; 
    
      constructor(http: Http) {
      }
    
      ngOnInit() {
        this.result = http.get('friends.json')
                      .map(response => response.json());
       }
    }
    

vous pouvez remarquer que les observables sont paresseux. Ainsi, la requête HTTP correspondante ne sera appelée qu'une fois qu'un auditeur y est attaché en utilisant la méthode subscribe .

vous pouvez également noter que la méthode map est utilisée pour extraire le contenu JSON de la réponse et l'utiliser ensuite dans le traitement observable.

J'espère que cela vous aidera, Thierry

133
répondu Thierry Templier 2017-05-23 12:02:56
import { HttpClientModule } from '@angular/common/http';

L'API HttpClient a été introduite dans la version 4.3.0. Il s'agit d'une évolution de L'API HTTP existante et possède son propre paquet @angular/common/http. Un des changements les plus notables est que maintenant l'objet response est un JSON par défaut, il n'y a donc plus besoin de l'analyser avec la méthode map .Tout de suite nous pouvons utiliser comme ci-dessous

http.get('friends.json').subscribe(result => this.result =result);
10
répondu rajesh kumar 2017-10-23 12:17:40