Javascript RxJs map函数导致多次调用上游observable

Javascript RxJs map函数导致多次调用上游observable,javascript,angular,rxjs,rxjs5,Javascript,Angular,Rxjs,Rxjs5,我对RxJS有点陌生,我对Observable上的map有问题,这会导致多次调用上游Observable(即HTTP请求) 我举了以下例子: 要点如下 function simulateHttp(val: any, delay:number) { return Observable.of(val) .delay(delay); } function timeLog(msg) { console.log(`${new Date().toISOString()}:

我对RxJS有点陌生,我对Observable上的
map
有问题,这会导致多次调用上游Observable(即HTTP请求)

我举了以下例子:

要点如下

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

function timeLog(msg) {
    console.log(`${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}#`);
function simulateHttp(val:any,delay:number){
可观测返回值(val)
.延迟(延迟);
}
函数timeLog(msg){
log(`${new Date().toISOString()}:${msg}`);
}
常量时间流:可观察=间隔可观察
.创建(8000)
const manualRefreshStream=新主题();
const combinedTriggerStream:Observable=Observable.merge(timerStream,manualRefreshStream);
const httpResultStream=combinedTriggerStream.switchMap(v=>{
返回模拟EHTTP('http'+v,3000);
});
const dataStream=httpResultStream
.map(v=>`*${v}*`)
.map(v=>`v}${v}`);
基本上,只要我通过
httpResult
流上的
map
进行转换,就会多次调用
simulateHttp
方法


我在谷歌上四处搜索,似乎
共享
可能是解决方案,但我还不太了解将其放在何处以及原因。

我通过这样做成功地删除了多个调用

const httpResultStream = combinedTriggerStream
   .switchMap(v => simulateHttp('http ' + v, 3000))
   .share(); 
还是不知道我为什么需要这个


此外,我发现这篇文章非常有用,尽管它与我的问题无关

map
本身并不进行多次订阅,但您在示例中多次使用
logSubscribe
,因此很难判断订阅来自何处。也许可以尝试使用
do
来记录流中发生的事情,这样可以避免多次订阅的副作用。@martin,我在多次迭代中尝试了这个示例。问题只会在我对httpResultStream执行
map
时开始。如果我没有,那么我只得到一次调用。@martin,感谢您提供的信息,我删除
map
操作符的尝试确实表明根本原因是“冷”观测上的多个订户。再加上@Jeto的信息,我想我终于明白发生了什么。无论如何,我想我的主要困惑源于这样一个事实,即我的直觉是,
switchMap
应该使可观察到的热,而它显然没有。
share
操作符使您的可观察到的热,这基本上意味着流在订阅者之间共享。例如,在网络上有很多关于它的文章。@Jeto感谢这个有趣的链接。我做了更多的挖掘,这似乎真的是由多个订户造成的。执行
map
似乎没有任何区别,尽管我可以发誓我在添加http调用后看到了多次调用。