«Сглаживание» в Observables аналогично понятию сглаживания массивов, с которым вы, возможно, уже знакомы.
Например:
[[0], [1, 2], [3]].flatten()
// output [0, 1, 2, 3]
В общем случае выравнивание означает взятие типа типов значений (например, массив массивов значений) и создание обратного типа значений (например, массив значений).
Типом типов иногда называют Тип высшего порядка (например, функция высшего порядка - это функция, возвращающая функцию, Наблюдаемый более высокого порядка - это Наблюдаемая из наблюдаемых). Таким образом, уплощение преобразует тип высшего порядка в тип первого порядка.
Написано на TypeScript flatten
- это функция со следующей подписью:
flatten(source: Type<Type<Value>>): Type<Value>
В RxJS эквивалентно flatten
равно mergeAll
оператор:
of(of(0), of(1, 2), of(3)).pipe(mergeAll())
// produce Observable<number> -> [0, 1, 2, 3]
Комбинация map
и flatten
- это то, что часто называют flatMap
, хотя имя может отличаться, основная концепция одна и та же - делать отображение и выравнивание как одно действие.
В контексте массива вместо:
[0, 1, 2, 3].map(x => Array(x).fill(x)).flatten()
// [[], [1], [2, 2], [3, 3, 3]].flatten()
// output: [1, 2, 2, 3, 3, 3]
Мы можем просто использовать:
[0, 1, 2, 3].flatMap(x => Array(x).fill(x))
RxJS имеет довольно много операторов, которые действуют как flatMap
:
mergeMap
- сглаживает наблюдаемые одновременно, поэтому входные и выходные значения могут быть потенциально в другом порядке
concatMap
- последовательно сглаживает Observables по одному, поэтому входные и выходные значения будут в одинаковом порядке
switchMap
- выравнивает наблюдаемое, но предоставляет только самое последнее значение
Обычно эти операторы типа flatMap
просто вызовут subscribe
в Observable, возвращаемом из функции отображения, и будут управлять основными подписками для нас.