Я немного новичок в 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 может быть решением, но я недостаточно хорошо разбираюсь, чтобы понять, где его разместить и Зачем.
@martin, пример пробовал несколько раз. Проблемы начинаются только тогда, когда я использую map в httpResultStream. Если я этого не сделаю, то я получу только один вызов.
@martin, спасибо за информацию, моя попытка удалить операторы map действительно показала, что основной причиной было несколько подписчиков на "холодном" наблюдаемом. Вместе с информацией от @Jeto я думаю, что наконец понял, что происходит. В любом случае, я предполагаю, что моя основная путаница связана с тем фактом, что я чувствую, что switchMap должен делать наблюдаемое горячим, чего, по-видимому, не делает.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Мне удалось удалить несколько вызовов, выполнив
const httpResultStream = combinedTriggerStream
.switchMap(v => simulateHttp('http ' + v, 3000))
.share();
Все еще не уверен, зачем мне это нужно.
Также я нашел эту статью весьма полезной, хотя она не относилась к моему вопросу https://blog.angular-university.io/rxjs-switchmap-operator/
Оператор share делает вашу наблюдаемую "горячей", что в основном означает, что поток распределяется между подписчиками. Об этом много статей в сети, например Вот этот.
@Jeto спасибо за интересную ссылку. Я еще немного покопался, и это действительно похоже на то, что у меня несколько подписчиков. Выполнение map, похоже, не имело никакого значения, хотя я мог бы поклясться, что видел несколько вызовов http-вызова после его добавления.
mapсам по себе не делает множественных подписок, но вы используетеlogSubscribeтак много раз в своем примере, что трудно сказать, откуда эти подписки. Возможно, попробуйте использоватьdoдля регистрации того, что происходит в ваших потоках, и вы избежите побочных эффектов нескольких подписок.