Какая польза от объединения 'mergeMap' и 'of' в этом коде? - PullRequest
0 голосов
/ 02 октября 2019

Я видел эту строку кода:

this.http.get(`/payments`).pipe(
      mergeMap((payments) => {
        return of(payments);
      }),
    );

это так же, как это (если так, почему это написано таким образом?):

this.http.get(`/payments`)

Ответы [ 4 ]

2 голосов
/ 02 октября 2019
this.http.get(`/payments`).pipe(
      mergeMap((payments) => of(payments)),
);

Для каждого испускаемого значения оператор mergeMap () создает новую наблюдаемую с этим значением, а затем оператор подписывается на эту новую наблюдаемую. Каждое значение, испускаемое этой наблюдаемой, пересылается подписчику до тех пор, пока не завершится внутренняя наблюдаемая.

Это повторяется для каждого испускаемого значения из наблюдаемой источника.

Здесь нет задержки или многоадресной передачи. поскольку of(payments) будет выдавать значение в том же стеке вызовов JavaScript.

Вы можете заменить mergeMap на switchMap () , и это также не будет иметь никакого эффекта.

Исходный код является наиболее вероятным остатками чьей-либо попытки отладки или изменения выданных значений, и поскольку http.get() выдает одно значение, не имеет значения, использовали ли вы в этом случае mergeMap или switchMap. Большинство людей, которые используют эти операторы с HTTP-вызовом, должны связываться с другим HTTP-вызовом.

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

https://github.com/reactgular/observables

2 голосов
/ 02 октября 2019

Давайте посмотрим на это в действии

const httpCall = rxjs.of('payment');

httpCall.pipe(
  rxjs.operators.mergeMap(v => rxjs.of(v))
).subscribe(v => console.log(v));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.3/rxjs.umd.js"></script>

Так что в принципе это ничего не делает.

1 голос
/ 02 октября 2019

Возможно, что-то вроде цепочки запросов, например:

this.http.get(`/payments`).pipe(
  mergeMap(response => this.http.post(`/audit`, response.id)),
  map(secondResponse => {})
)

, но в конечном итоге было заменено на один http-вызов.

mergeMap или flatMap можно использовать для уплощение наблюдаемых (для преобразования наблюдаемой наблюдаемой в одну наблюдаемую)

Таким образом, ответ да - изменение на this.http.get('/payments') не изменит поведение вообще.

0 голосов
/ 02 октября 2019

Согласно документации RxJS :

Этот оператор лучше всего использовать, если вы хотите сгладить внутреннюю наблюдаемую, но хотите вручную контролировать количество внутренних подписок. Например, при использовании switchMap каждая внутренняя подписка завершается, когда источник излучает, позволяя только одну активную внутреннюю подписку. В отличие от этого, mergeMap позволяет одновременно активировать несколько внутренних подписок. Из-за этого один из наиболее распространенных вариантов использования mergeMap - это запросы, которые не следует отменять, например, пишет, а не читает. Обратите внимание, что если порядок должен поддерживаться, лучше использовать concatMap.

В основном это означает, что в случае, если у вас есть несколько подписок на эту наблюдаемую информацию, у вас все равно будет один вызов API, поскольку эти подписки управляютсявнутренне.

  • В случае одной подписки нет никакой разницы
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...