Эмитит предыдущие и текущие значения в виде массива. То есть - значением каждого евента в потоке будет массив с двумя элементами.
На позиции 0
- будет значение предыдущего евента, на позиции 1
- значение текущего евента:
[0,1], [1,2], [2,3], [3,4], [4,5]
Оператор pairwise
лучше всего подходит, когда нужно сравнить или выполнить вычисления между текущими и предыдущими значениями, выдаваемыми потоком.
Реальные примеры можно увидеть в таких сценариях, как отслеживание движения мыши, где предыдущая и текущая позиции используются для определения направления или скорости курсора; или в финансовых приложениях, где последовательные обновления цен акций сравниваются для расчета изменения или процентного изменения.
interval(1000)
.pipe(
pairwise(),
take(5),
filter(([a,b]) => a < b)
)
.subscribe(console.log);
Оператор pairwise
не выдаст начальное значение, пока поток не выдаст по крайней мере два значения.
Такое поведение может привести к путанице, поскольку не будет вывода и ошибок, но поток может работать не так, как предполагалось, или ожидать больше значений.
Пример из практики Link to heading
// Регистрируем явный вход (страница входа, регистрация и т.п.)
this._session.state$.pipe(
startWith(null),
pairwise(),
takeUntil(this._destroy$)
).subscribe(([prevState, nextState]) => {
if (nextState === 'opened' && prevState === 'closed') {
this.store.dispatch(AuthActions.LoggedIn);
}
});
Выше приведен реальный пример из практики коммерческой разработки. Здесь применяется pairwise()
для того, чтобы получить из потока this._session.state$
значения, которые потом при помощи этого оператора можно сгрупировать в пары .subscribe(([prevState, nextState])
и затем - сравнить значения этой пары - if (nextState === 'opened' && prevState === 'closed')
.
Ссылки Link to heading
Marble Diagram - Operator pairwise