RxJs - оператор pairwise

Эмитит предыдущие и текущие значения в виде массива. То есть - значением каждого евента в потоке будет массив с двумя элементами.

На позиции 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