меню

Observable - это название механизма, который используется в Angular для программирования асинхронных потоков данных в декларативном стиле. Observable является синонимом термина stream. К асинхронным потокам данных обычно относятся такие концепции, как события, http запросы и триггеры в коде.

Данный механизм позволяет создавать объекты, инициирующие асинхронные потоки (stream или observable) и объекты, которые за ними наблюдают (observer).

Над observable можно производить различные операции, например, их можно создавать, комбинировать и фильтровать. Более того практически все что угодно может быть потоком. Потоковое программирование это очень гибкая концепция, позволяющая реализовывать необходимую логику минимальным количеством кода.

Для расширенной реализации observable в Angular используется сторонняя библиотека Reactive Extensions (RxJS).

Работа с потоками стоится на двух объектах - observable и observer. Эти методы представляет один и тот же объект, что делает удобным реализацию данного механизма в виде сервиса.

Observableимеет 3 состояния:

  • обработка данных
  • успешное завершение обработки
  • ошибка обработки

Interval

rxjs/Rx - дает дополнительные возможности для Observable. Создадим объект класса Observable, который будет отправлять и принимать сообщения. Для отправки сообщений используем метод interval(), который отправляет последовательные числа от нуля через заданный промежуток времени. Для приема сообщений используем метод subscribe(), в который передадим callback, выводящий каждое сообщение в консоль.

 
import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import 'rxjs/Rx';

//...
export class HomeComponent implements OnInit {
//...
  ngOnInit() {
    const obsExample = Observable.interval(1000);
    obsExample.subscribe( num => console.log(num) );
  }
}
  

Создание своего Observable

У класса Observable есть метод create(), который создает новый экземпляр Observable.

  
import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { Observer } from 'rxjs/Observer';
import 'rxjs/Rx';
//...
  const myObservable = Observable.create((observer: Observer<string>) => {
    setTimeout(() => {
      observer.next('first package');
    }, 2000);
    setTimeout(() => {
      observer.next('second package');
    }, 4000);
    setTimeout(() => {
      // observer.error('this does not work');
      observer.complete();
    }, 5000);
    setTimeout(() => {
      observer.next('third package');
    }, 6000);
  });

  myObservable.subscribe(
    (data: string) => { console.log(data); },
    (error: string) => { console.log(error); },
    () => { console.log('completed'); }
  );
 

Unsubscribe

Для отписки от события, используется метод unsubcribe() класса Subscription.

Пример реализации отписки в методе ngOnDestroy():

  
import { Component, OnInit, OnDestroy } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { Observer } from 'rxjs/Observer';
import { Subscription } from 'rxjs/Subscription';
import 'rxjs/Rx';
//...
export class HomeComponent implements OnInit, OnDestroy {
  customSubscription: Subscription;
  constructor() { }
  ngOnInit() {
    const myObservable = Observable.create((observer: Observer<string>) => {
      //...
    });

    this.customSubscription = myObservable.subscribe(
      //...
    );
  }

  ngOnDestroy() {
    this.customSubscription.unsubscribe();
  }
}
  

Возможно, вам будет интересно

Route. Обновление шаблона

Обновление шаблона при динамическом роутинге и отписка от наблюдения

Route. Контроль навигации с помощью сервиса

Деактивации роута в Angular5 и контроль навигации

Навигация. Передача данных событиями

Навигация в Angular на основе событий. Передача данных между вложенными компонентами с помощью событий в Angular

Route Resolving

Разрешение динамических данных перед активацией роута и интерфейс Resolve в Angular

Оформление заявки

Документы на создание сайта

Изучите наше коммерческое предложение, заполните БРИФ и отправьте его на почту maxidebox@list.ru. Изучив все пожелания из БРИФ-а, обратным ответом оповестим Вас по стоимости разработке, ответим на вопросы.

КП на создание сайта Коммерческое предложение на созданеи сайта

Мы берем на себя ответственность за все стадии работы и полностью избавляем клиентов от забот и необходимости вникать в тонкости.

Скачать БРИФ (акета) на создание сайта Скачать БРИФ (акета) на создание сайта

Зополните у БРИФ-а все необходимые поля. Сделайте краткое описание к каждому из пунктов анкеты, привидите примеры в соответсвующий пунктах - это позволит лучше понять Ваши ожидания и требования к сайту