Оператор mergeMap
mergeMap
- это оператор высшего порядка (Higher-Order Observable) в RxJS, который используется для преобразования элементов одного потока данных (Observable) в другой поток данных. Он применяет функцию к каждому элементу и возвращает новый Observable, который объединяет (merge) результаты всех внутренних Observable в один поток.
Давайте разберемся с примером кода и объясним каждую деталь:
import { of } from 'rxjs';
import { mergeMap } from 'rxjs/operators';
// Исходный поток данных
const source$ = of(1, 2, 3);
// Функция-преобразователь, принимающая элементы и возвращающая внутренний Observable
const transform = (value: number) => {
// Создаем внутренний Observable
const inner$ = of(value * 2);
return inner$;
};
// Применяем mergeMap для каждого элемента и объединяем результаты в один поток
const result$ = source$.pipe(
mergeMap(transform)
);
// Подписываемся на результат
result$.subscribe(result => console.log(result));
В этом примере у нас есть исходный поток данных source$
, который содержит значения 1, 2 и 3. Затем у нас есть функция-преобразователь transform
, которая принимает каждый элемент и возвращает внутренний Observable inner$
, содержащий преобразованные значения (в данном случае, умноженные на 2).
С помощью оператора mergeMap
мы применяем функцию-преобразователь к каждому элементу исходного потока и объединяем результаты в один поток данных result$
.
Результат подписки на result$
выводится в консоль: 2, 4, 6.
Что происходит за кулисами? Когда каждый элемент проходит через mergeMap
, он передается в функцию-преобразователь transform
. Внутри transform
мы создаем внутренний Observable inner$
, который эмитит преобразованное значение (в данном случае, значение умноженное на 2). Затем все внутренние Observable объединяются в один поток данных result$
, который эмитит все значения в порядке их завершения.
Оператор mergeMap
полезен, когда у вас есть поток данных, и вы хотите применить асинхронное преобразование к каждому элементу, которое может возвращать внутренние Observable. Результаты объединяются в один поток данных, что позволяет эффективно работать с асинхронными операциями и поддерживать порядок элементов.