Функция карты RxJs вызывает многократный вызов наблюдаемого восходящего потока

Я немного новичок в RxJS, и у меня возникли проблемы с map на Observable, из-за чего вышестоящий Observable вызывается несколько раз (то есть HTTP-запрос).

У меня есть такой пример:

https://stackblitz.com/edit/angular-rxjs-playground-uxygsb?file=app%2Fapp.component.ts

суть в следующем

function simulateHttp(val: any, delay:number) {
    return Observable.of(val)
        .delay(delay);
}

function timeLog(msg) {
    console.info(`${new Date().toISOString()}:  ${msg}`);   
}

const timerStream: Observable<number> = IntervalObservable
  .create(8000)
const manualRefreshStream = new Subject<any>();
const combinedTriggerStream: Observable<any> = Observable.merge(timerStream, manualRefreshStream);

const httpResultStream = combinedTriggerStream.switchMap(v => {
  return simulateHttp('http ' + v, 3000);
});
const dataStream = httpResultStream
  .map(v => `*${v}*`)
  .map(v => `#${v}#`);

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

Я погуглил, и кажется, что share может быть решением, но я недостаточно хорошо разбираюсь, чтобы понять, где его разместить и Зачем.

map сам по себе не делает множественных подписок, но вы используете logSubscribe так много раз в своем примере, что трудно сказать, откуда эти подписки. Возможно, попробуйте использовать do для регистрации того, что происходит в ваших потоках, и вы избежите побочных эффектов нескольких подписок.
martin 10.03.2018 12:05

@martin, пример пробовал несколько раз. Проблемы начинаются только тогда, когда я использую map в httpResultStream. Если я этого не сделаю, то я получу только один вызов.

RaB 10.03.2018 12:09

@martin, спасибо за информацию, моя попытка удалить операторы map действительно показала, что основной причиной было несколько подписчиков на "холодном" наблюдаемом. Вместе с информацией от @Jeto я думаю, что наконец понял, что происходит. В любом случае, я предполагаю, что моя основная путаница связана с тем фактом, что я чувствую, что switchMap должен делать наблюдаемое горячим, чего, по-видимому, не делает.

RaB 10.03.2018 14:23
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
375
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне удалось удалить несколько вызовов, выполнив

const httpResultStream = combinedTriggerStream
   .switchMap(v => simulateHttp('http ' + v, 3000))
   .share(); 

Все еще не уверен, зачем мне это нужно.

Также я нашел эту статью весьма полезной, хотя она не относилась к моему вопросу https://blog.angular-university.io/rxjs-switchmap-operator/

Оператор share делает вашу наблюдаемую "горячей", что в основном означает, что поток распределяется между подписчиками. Об этом много статей в сети, например Вот этот.

Jeto 10.03.2018 12:32

@Jeto спасибо за интересную ссылку. Я еще немного покопался, и это действительно похоже на то, что у меня несколько подписчиков. Выполнение map, похоже, не имело никакого значения, хотя я мог бы поклясться, что видел несколько вызовов http-вызова после его добавления.

RaB 10.03.2018 14:20

Другие вопросы по теме