Наблюдаемый — это термин, который часто обсуждается, когда речь идет об асинхронном программировании. Помимо своей популярности, это понятие сложно понять с первого взгляда. Цель этого блога — предоставить вам самое простое введение в Observables и его приложения.

Что такое Observable?

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

В концепции Observable есть три ключевых термина: наблюдаемый, наблюдатель и подписка. Знание этих терминов облегчит вам понимание других терминов, связанных с наблюдаемыми.

Представьте себе такой сценарий. В ваш район каждый день приезжает грузовик с едой, где подают вкусную пасту. Вы и ваши друзья любите макароны, поэтому однажды вечером вы решили просто поесть макарон и поболтать друг с другом. Однако вы не сможете отследить, когда прибудет грузовик с едой самостоятельно. К счастью, у вас в квартире есть сторож, который может следить за прибытием грузовика с едой. Вы можете попросить его позвонить вам, когда приедет грузовик с едой.

Аналогия не очень точна, наблюдаемые более сложны. Но ладно, для начала...

Здесь я дал точные определения каждого термина и упростил их на основе упомянутой ранее аналогии:
Наблюдаемый: производитель потока данных. можно наблюдать. Проще говоря, исходя из нашей аналогии, грузовик с едой можно наблюдать.
Observer: набор обратных вызовов, который знает, как прослушивать значения, предоставленные observable. Здесь сторож — это наблюдатель.
Подписка: представляет выполнение наблюдаемого объекта. Проще говоря, по аналогии с сторожем, чтобы он сообщил вам, когда прибудет грузовик с едой.

Я надеюсь, что эти термины теперь немного ясны.

Как создать объект наблюдения и подписаться на него?

Чтобы наблюдаемое работало, на него нужно подписаться…..

// creating the observable
var observable = Rx.Observable.create((observer) => 
  observer.next('The food truck has arrived')
}) 

// To make an observable work, we need to subscribe it

// According to our analogy, subscribing is telling the watchman 
// to notify us when the food truck arrives

observable.subscribe((data)=>{
   console.log(data);    
})

/*
    Output is:
    The food truck has arrived
*/

Существует три типа значений, которые наблюдатель может передать подписчику:
- observer.next(): Функция .next() передает значение подписчику, и ее можно использовать для передачи нескольких значений подписчику.
-Observer.complete(): После вызова .complete( ), подписчик больше не может передавать значения наблюдаемому объекту.
-Observer.error(): Функция .error() используется для обработки ошибок.

Рассмотрим применение каждой из этих функций на примере:

// creating an observable
var observable = Rx.Observable.create((observer) => {
  try{
    // pushing the value inside observable using
    observer.next('start');
  
    setTimeout(()=>{
       observer.next('from setTimeout')
    },1000)
  
    observer.complete();

    // This line will not be executed as the complete notification
    // is already being sent...
    observer.next('after complete')

  } catch(error) {
    // This line will be executed only if an error occurs
    observer.error(error)
  }
}) 

// To make an observable work, we need to subscribe to it :

observable.subscribe((data)=>{
   console.log(data);    
})

/** 
    Output is: 
    start
    from setTimeout
**/

Здесь .next() помещает значение в наблюдаемое. Однако значения больше не передаются в наблюдаемый объект после вызова .complete()/.error().

Поскольку мы разобрались с основами, теперь мы можем обсудить технические термины и определение наблюдаемой. Наблюдаемое является частью библиотеки Rxjs (реактивное расширение для javascript), которая представляет собой не что иное, как реактивное программирование. А Реактивное программирование — это программирование с использованием асинхронных потоков данных.

Поток — это последовательность текущих событий, упорядоченных во времени. Здесь упорядоченное по времени означает, что это может быть одно событие или несколько событий за определенный период времени.

Я знаю, что приведенные выше утверждения не имеют для вас особого смысла, но давайте разберемся в них, рассмотрев примеры из реальной жизни.
- Нажатия клавиш или движение курсора являются примером асинхронного потока данных (поток данных из нескольких событий за определенный период времени).
 – HTTP-запрос является примером асинхронного потока данных (потока данных одного события).

Операторы в Rxjs

Библиотека Rxjs также предоставляет различные операторы (функции) для манипулирования, фильтрации или изменения выходных данных наблюдаемых. Это делает эту библиотеку мощной и популярной. Существует два основных типа операторов: операторы создания и конвейерные операторы.

Что такое операторы создания?

Операторы создания — это функции, которые можно использовать для создания Observable с некоторым общим предопределенным поведением или путем присоединения к другим Observable.
Их называют автономными методами, создающими новые Observable. Из предыдущих примеров .next() также является
Например: of() — это оператор создания, который создает Observables из любых данных, будь то строка, массив, объект или даже обещание. .

import { of, map } from 'rxjs';

// Here of() operator converts the group of numbers into observable
const observable = of(1, 2, 3)

observable.subscribe(data => console.log(data));

/*
  Output is:
  1
  2
  3

*/

Что такое конвейерные операторы?
Конвейерные операторы — это операторы, которые могут быть переданы в Observables с использованием синтаксисаobservableInstance.pipe(operator()). Конвейерный оператор — это функция, которая принимает одно наблюдаемое в качестве входных данных и генерирует другое наблюдаемое в качестве выходных данных. Различные операторы каналов включают map(), pluck() и т. д. Например, оператор map() определен в канале, где вы можете изменить содержимое выдаваемых значений из одного наблюдаемого объекта, чтобы сформировать другой новый наблюдаемый объект.

import { of, map } from 'rxjs';

const observable = of('The food truck has arrived');
observable.pipe(map(data => data.toUpperCase()))

observable.subscribe(data => console.log(data));

/*
  Output is:
  THE FOOD TRUCK HAS ARRIVED
*/

С помощью библиотеки Rxjs вы можете преобразовать практически все в наблюдаемые объекты, которые затем можно фильтровать, изменять или манипулировать в соответствии с требованиями.

Я надеюсь, что после прочтения этого блога у вас есть общее представление о Rxjs Observable. Чтобы узнать больше о Rxjs, вы можете обратиться к документации https://rxjs.dev/guide/overview.

В следующем блоге я расскажу, чем наблюдаемые объекты отличаются от обещаний и почему наблюдаемые лучше обещаний.

А пока будьте счастливы и оставайтесь здоровыми!!!!!
Кроме того, не стесняйтесь комментировать ниже, если у вас есть какие-либо сомнения или предложения…..