Когда вы объединяете несколько 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 перед объединением и затем проверить значения внутри подписки для определения источника.