Merge несколько observable — как узнать какой именно observable сработал?

Когда вы объединяете несколько Observable объектов в один, используя оператор merge(), то вам может потребоваться знать, какой именно из Observable объектов вызвал событие. Существует несколько способов это сделать в Angular.

1. Использование оператора map()

Один из способов определить, какой Observable сработал, состоит в использовании оператора map(). Оператор map() позволяет вам изменить значение, возвращаемое Observable. Вы можете добавить некоторую идентификацию (например, строку) к каждому Observable перед объединением и затем проверить это значение внутри подписки.

Вот пример кода:

import { merge, Observable } from 'rxjs';
import { map } from 'rxjs/operators';

const observable1: Observable<string> = ...;
const observable2: Observable<string> = ...;

const mergedObservable = merge(
  observable1.pipe(map(value => ({ source: 'observable1', value }))),
  observable2.pipe(map(value => ({ source: 'observable2', value })))
);

mergedObservable.subscribe(result => {
  if (result.source === 'observable1') {
    // observable1 сработал
  } else if (result.source === 'observable2') {
    // observable2 сработал
  }
});

В этом примере, каждый элемент, возвращаемый Observable объектом observable1 или observable2, помещается в объект, который содержит информацию о источнике (observable1 или observable2). Это позволяет вам проверить значения внутри подписки и определить, какой Observable сработал.

2. Использование BehaviorSubject

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

Вот пример кода:

import { merge, Observable, BehaviorSubject } from 'rxjs';

const observable1: Observable<string> = ...;
const observable2: Observable<string> = ...;

const source1 = new BehaviorSubject(null);
const source2 = new BehaviorSubject(null);

observable1.subscribe(value => source1.next(value));
observable2.subscribe(value => source2.next(value));

const mergedObservable = merge(source1, source2);

mergedObservable.subscribe(result => {
  if (result === source1.getValue()) {
    // observable1 сработал
  } else if (result === source2.getValue()) {
    // observable2 сработал
  }
});

В этом примере, когда Observable объекты observable1 и observable2 срабатывают, их значения передаются в соответствующие BehaviorSubject source1 и source2. Затем объединенный Observable mergedObservable переключается на эти BehaviorSubject и, следовательно, передача последнего значения каждого BehaviorSubject.

Вы можете проверить, что значение, полученное внутри подписки на mergedObservable, соответствует значению, хранимому в source1 или source2, чтобы определить, какой Observable сработал.

Таким образом, есть несколько способов определения того, какой Observable сработал при объединении нескольких Observable объектов в Angular. Вы можете использовать оператор map() или BehaviorSubject для добавления идентификации или хранения последнего значения каждого Observable перед объединением и затем проверить значения внутри подписки для определения источника.