Подписка на внутреннюю Observable внутри карты слияния, это плохая практика? - PullRequest
0 голосов
/ 14 марта 2019

Мне нужно позвонить в API, и когда приходят данные, мне нужно сделать 2 вещи:

  1. Обновить набор данных
  2. Еще раз позвонить в APIс результатом наблюдаемой для обновления второго набора данных.

Я использую mergeMap, который выполняет вызов и подписывается, а mergeMap просто возвращает данные, переданные в качестве наблюдаемой.Я новичок в Rx, есть ли лучший способ сделать это?

Есть ли способ избежать управления подписками в целом вручную?для конечных данных я мог бы просто использовать асинхронный канал на интерфейсе пользователя.

Вот ссылка на stackblitz

1 Ответ

0 голосов
/ 14 марта 2019

Вам не нужно подписываться внутри оператора mergeMap.

Идея mergeMap / flatMap заключается в выравнивании цепочки наблюдаемых.Например, если вы сделали это так:

const source = Rx.of('Hello');
source.map(val => doOperationThatReturnsObservable(val)).map(f)

Функция f получит Observable.

Если вы сделали это так:

const source = Rx.of('Hello');
source.mergeMap(val => doOperationThatReturnsObservable(val)).map(f)

Функция f получит значение второй наблюдаемой.Другими словами, mergeMap, concatMap, swichtMap - это функции, которые позволяют комбинировать наблюдаемые или отображать значения в наблюдаемые, сохраняя при этом поток данных.

Для конкретной проблемы, которую вы описали, я думаю, вы могли бы решить так:

const firstApiCall = createFirstApiCallObservable();
const secondApiCall = firstApiCall.mergeMap(data => createSecondApiCallObservableFromData(data));

// If you need to do the updates in the same time:
Observable.zip(firstApiCall, secondApiCall, 
  (data1, data2) => [data1, data2])
  .subscribe(data => {
    data1 = data[0];
    data2 = data[1];
    doFirstUpdate(data1);
    doSecondUpdate(data2);
  });
  
// If you can do the updates separatly:
firstApiCall.subscribe(data1 => doFirstUpdate(data1));
secondApiCall.subscribe(data2 => doSecondUpdate(data2));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...