Spec-Zone.ru › RxJS

distinctUntilChanged

function stable operator

Возвращает результат Observable, который излучает все значения, отправленные исходным наблюдаемым, если они отличаются от последнего значения, излученного наблюдаемым результатом.

distinctUntilChanged(comparator?: (previous: T, current: T) => boolean): MonoTypeOperatorFunction<T>

Параметры

comparator (previous: T, current: T) => boolean

Необязательно. По умолчанию undefined.

Возвращает

MonoTypeOperatorFunction<T>

distinctUntilChanged(comparator: (previous: K, current: K) => boolean, keySelector: (value: T) => K): MonoTypeOperatorFunction<T>

Параметры

comparator (previous: K, current: K) => boolean
keySelector (value: T) => K

Возвращает

MonoTypeOperatorFunction<T>

Описание

Без параметров или с первым параметром (comparator) ведет себя следующим образом:

  1. Всегда излучает первое значение из источника.
  2. Для всех последующих значений, отправленных источником, они сравниваются с ранее излученными значениями с использованием предоставленного comparator или проверки на равенство ===.
  3. Если значение, отправленное источником, определяется как неравное по этой проверке, это значение излучается и становится новым «ранее излученным значением» внутри.

При предоставлении второго параметра (keySelector) поведение меняется:

  1. Всегда излучает первое значение из источника.
  2. keySelector будет выполняться для всех значений, включая первое.
  3. Для всех значений после первого, выбранный ключ сравнивается с ключом, выбранным из ранее излученного значения, с использованием comparator.
  4. Если ключи определяются как неравные по этой проверке, излучается значение (а не ключ), и выбранный ключ из этого значения сохраняется для будущих сравнений с другими ключами.

Примеры

Очень простой пример без comparator. Обратите внимание, что 1 излучается более одного раза, потому что он отличается от предыдущего излученного значения, а не от всех других излученных значений.

import { of, distinctUntilChanged } from 'rxjs';

of(1, 1, 1, 2, 2, 2, 1, 1, 3, 3)
  .pipe(distinctUntilChanged())
  .subscribe(console.log);
// Logs: 1, 2, 1, 3

С comparator, вы можете выполнять пользовательские сравнения. Предположим, вы хотите излучать значение только тогда, когда все его компоненты изменились:

import { of, distinctUntilChanged } from 'rxjs';

const totallyDifferentBuilds$ = of(
  { engineVersion: '1.1.0', transmissionVersion: '1.2.0' },
  { engineVersion: '1.1.0', transmissionVersion: '1.4.0' },
  { engineVersion: '1.3.0', transmissionVersion: '1.4.0' },
  { engineVersion: '1.3.0', transmissionVersion: '1.5.0' },
  { engineVersion: '2.0.0', transmissionVersion: '1.5.0' }
).pipe(
  distinctUntilChanged((prev, curr) => {
    return (
      prev.engineVersion === curr.engineVersion ||
      prev.transmissionVersion === curr.transmissionVersion
    );
  })
);

totallyDifferentBuilds$.subscribe(console.log);

// Logs:
// { engineVersion: '1.1.0', transmissionVersion: '1.2.0' }
// { engineVersion: '1.3.0', transmissionVersion: '1.4.0' }
// { engineVersion: '2.0.0', transmissionVersion: '1.5.0' }

Вы также можете предоставить пользовательскую comparator для проверки того, что измененные события излучаются только в одном направлении. Предположим, вы хотите получить только следующую температуру записи:

import { of, distinctUntilChanged } from 'rxjs';

const temps$ = of(30, 31, 20, 34, 33, 29, 35, 20);

const recordHighs$ = temps$.pipe(
  distinctUntilChanged((prevHigh, temp) => {
    // If the current temp is less than
    // or the same as the previous record,
    // the record hasn't changed.
    return temp <= prevHigh;
  })
);

recordHighs$.subscribe(console.log);
// Logs: 30, 31, 34, 35

Выбор событий обновления только тогда, когда поле updatedBy показывает, что собственник счета изменился.

import { of, distinctUntilChanged } from 'rxjs';

// A stream of updates to a given account
const accountUpdates$ = of(
  { updatedBy: 'blesh', data: [] },
  { updatedBy: 'blesh', data: [] },
  { updatedBy: 'ncjamieson', data: [] },
  { updatedBy: 'ncjamieson', data: [] },
  { updatedBy: 'blesh', data: [] }
);

// We only want the events where it changed hands
const changedHands$ = accountUpdates$.pipe(
  distinctUntilChanged(undefined, update => update.updatedBy)
);

changedHands$.subscribe(console.log);
// Logs:
// { updatedBy: 'blesh', data: Array[0] }
// { updatedBy: 'ncjamieson', data: Array[0] }
// { updatedBy: 'blesh', data: Array[0] }

См. также

  • distinct
  • distinctUntilKeyChanged

© 2015–2022 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors.
Code licensed under an Apache-2.0 License. Documentation licensed under CC BY 4.0.
https://rxjs.dev/api/operators/distinctUntilChanged

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API