有人可以解释一下为什么下面的代码会三次触发对服务器的请求吗?如果我直接订阅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);
答案 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调用)。