Rxjs - switchMap to http将可观察角色从热变为冷

时间:2016-10-21 21:50:11

标签: javascript angular rxjs

有人可以解释一下为什么下面的代码会三次触发对服务器的请求吗?如果我直接订阅http.get()我知道它的冷可观察性,所以它将导致callin服务器3次,我需要使用.share()来避免这种情况。但是当我订阅热门的主题时为什么会出现同样的行为......很奇怪:

let testTrigger = new Subject<any>();


let testTask$ = testTrigger.switchMap(()=> this.restClient.get('onet'));

testTask$.subscribe(console.log.call(console));
testTask$.subscribe(console.log.call(console));
testTask$.subscribe(console.log.call(console));
testTrigger.next(1);

2 个答案:

答案 0 :(得分:2)

事实上,大多数运营商都会这样做。即如果obs很热,那么obs.op一般都很冷。一些运算符也返回热的可观察量(例如groupBy)。最后,您需要阅读文档或测试,以了解您手中可观察到的性质。

有关详细信息,请查看Hot and Cold observables : are there 'hot' and 'cold' operators?

答案 1 :(得分:2)

将您的代码更改为:

let testTask$ = testTrigger.switchMap(()=> this.restClient.get('onet')).share();

这样所有订阅都将共享同一个管道。我猜你订阅时会触发映射(因此是http调用)。