Поиск…


замечания

Выполнение запросов API с помощью функции Angular 2 Http и RxJS очень похоже на работу с обещаниями в Angular 1.x.

Для выполнения запросов используйте класс Http . Класс Http предоставляет методы для выдачи HTTP-запросов GET , POST , PUT , DELETE , PATCH , HEAD помощью соответствующих методов. Он также предоставляет общий метод request для выдачи любого HTTP-запроса.

Все методы класса Http возвращают Observable<Response> , к которым вы можете применить операции RxJS . Вы вызываете метод .subscribe() и передаете функцию, которая будет вызываться, когда данные возвращаются в потоке Observable.

Поток Observable для запроса содержит только одно значение - Response и завершается / устанавливается, когда HTTP-запрос завершается успешно или ошибки / ошибки при возникновении ошибки.

Обратите внимание, что наблюдаемые, возвращаемые модулем Http являются холодными , что означает, что если вы подписываетесь на наблюдаемое несколько раз, исходный запрос будет выполняться один раз для каждой подписки. Это может произойти, если вы хотите использовать результат в нескольких компонентах вашего приложения. Для запросов GET это может привести к некоторым дополнительным запросам, но это может привести к неожиданным результатам, если подписываться более одного раза на запросы PUT или POST.

Основной запрос

Следующий пример демонстрирует простой HTTP-запрос GET. http.get() возвращает Observable , который имеет метод subscribe . Это добавляет возвращаемые данные в массив posts .

var posts = []

getPosts(http: Http):void {
    this.http.get(`https://jsonplaceholder.typicode.com/posts`)
        .map(response => response.json())
        .subscribe(post => posts.push(post));
}

Инкапсулирование запросов API

Может быть хорошей идеей инкапсулировать логику обработки HTTP в свой класс. Следующий класс предоставляет метод для получения сообщений. Он вызывает метод http.get() и вызывает .map на возвращаемом Observable для преобразования объекта Response объект Post .

import {Injectable} from "@angular/core";
import {Http, Response} from "@angular/http";

@Injectable()
export class BlogApi {

  constructor(private http: Http) {
  }

  getPost(id: number): Observable<Post> {
    return this.http.get(`https://jsonplaceholder.typicode.com/posts/${id}`)
      .map((response: Response) => {
        const srcData = response.json();
        return new Post(srcData)
      });
  }
}

Предыдущий пример использует класс Post для хранения возвращаемых данных, который может выглядеть следующим образом:

export class Post { 
  userId: number;
  id: number;
  title: string;
  body: string;

  constructor(src: any) {
      this.userId = src && src.userId;
      this.id = src && src.id;
      this.title = src && src.title;
      this.body = src && src.body;
  }
}

Компонент теперь может использовать класс BlogApi для легкого извлечения данных Post не BlogApi к BlogApi класса Http .

Подождите несколько запросов

Один из распространенных сценариев - дождаться завершения ряда запросов до продолжения. Это может быть выполнено с использованием метода forkJoin .

В следующем примере forkJoin используется для вызова двух методов, возвращающих Observables . Обратный вызов, указанный в методе .subscribe будет вызываться, когда оба Observables завершены. Параметры, предоставленные .subscribe соответствуют порядку, указанному в вызове .forkJoin . В этом случае сначала posts tags .

loadData() : void {
    Observable.forkJoin(
        this.blogApi.getPosts(),
        this.blogApi.getTags()
    ).subscribe((([posts, tags]: [Post[], Tag[]]) => {
        this.posts = posts;
        this.tags = tags;
    }));
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow