В чем разница между слиянием и слиянием? - PullRequest
1 голос

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

слияние - это метод создания c, который сглаживает группу наблюдаемых. в соответствии с документами

Сводит несколько наблюдаемых вместе, смешивая их значения в одну наблюдаемую.

merge

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

mergeAll Однако отличается, это метод экземпляра, который работает с наблюдаемыми более высокого порядка (наблюдаемые, которые испускают наблюдаемые), в соответствии с документами

Преобразует Наблюдаемый высшего порядка в Наблюдаемый первого порядка, который одновременно доставляет все значения, которые испускаются во внутренних Наблюдаемых.

Я думаю, что это подводит итог, но слияние может привести к путанице, поэтому давайте рассмотрим этот пример, предоставленный rx js docs

import { fromEvent, interval } from 'rxjs';
import { take, map, mergeAll } from 'rxjs/operators';

const higherOrder = fromEvent(document, 'click').pipe(
  map((ev) => interval(1000).pipe(take(10))),
);
const firstOrder = higherOrder.pipe(mergeAll(2));
firstOrder.subscribe(x => console.log(x));

у вас есть наблюдаемый щелчок документа (более высокий порядок), который возвращает наблюдаемый интервал (внутренняя наблюдаемая), который выдает значение каждую секунду, он завершится через 10 интервалов, то есть каждый раз, когда вы нажимаете на документ, новый интервал будет возвращено, здесь, где происходит слияние всех, оно подпишется на эти интервалы, возвращаемые наблюдаемой более высокого порядка, и объединяет их в одну наблюдаемую, наблюдаемую в первом порядке, аргумент 2, должен ограничиваться 2 одновременными интервалами одновременно , так что если вы нажали 3 раза, запустятся только 2, но, поскольку эти 2 интервала завершатся через 10 секунд, вы можете нажать еще раз, и mergeAll подпишется на новые интервалы.

0 голосов
/ 04 апреля 2020

И merge, и mergeAll наследуют от mergeMap!

mergeAll

mergeAll - это то же самое, что mergeMap с функция идентификации (const identity = x => x)

mergeAll() === mergeMap(obs$ => obs$)

Пример:

of(a$, b$, c$)
  .pipe(
    mergeAll(),
  )
  .subscribe()

// Same as
of(a$, b$, c$)
  .pipe(
    mergeMap(obs$ => obs$)
  )
  .subscribe()

Оба подпишутся на входящие наблюдаемые (a$, b$ и * 1023) *) и передаст их значения потребителю данных. Таким образом, a$, b$ и c$ считаются внутренними наблюдаемыми .

объединением

Вооруженными знаниями из предыдущего раздела, понимающими merge не должно быть сложно.

merge(a$, b$, c$).subscribe() по существу совпадает с

const observables = [a$, b$, c$];

new Observable(subscriber => {
  for (let i = 0; i < observables.length; i++) {
    subscriber.next(observables[i]);
  }

  subscriber.complete();
}).pipe(
  mergeAll()
).subscribe();
...