我有一个返回以下observable的方法。
class Service {
getData() {
// the select observable will fire on every form change
return this.store.select('filters').switchMap(filters => {
return this.http.get('call the api with the filters')
}).take(1);
}
}
在我的组件中,我将此方法称为提交。
class Component {
submit() {
this.service.getData().subscribe(...)
}
}
问题是,在我调用submit一次后,我在第二次提交中看到两个HTTP调用。我的问题是,在这种情况下,take(1)运算符是否同时杀死内部和外部可观察对象?
答案 0 :(得分:2)
这与take()
运算符完全无关。您只需使用两个链对同一个源Observable进行两次订阅。
take(1)
运算符只接受发出的第一个项目并发送complete
通知。
现在你有以下内容:
+-- switchMap --- take --> subscribe()
-- store --+
+-- switchMap --- take --> subscribe()
因此,相同的值被推送到具有两个不同switchMap
的两个不同的链。
虽然你可能想要这样的东西:
+--> subscribe()
-- store --- switchMap --+
+--> subscribe()
例如,你有这个(而不是do()
你有switchMap()
):
const subject = new Subject();
const obs = subject
.do(console.log);
obs.subscribe(i => console.log('next:', i));
obs.subscribe(i => console.log('next:', i));
subject.next(1);
...打印以下内容。请注意,do()
运算符已收到两个值:
1
next: 1
1
next: 1
相反,您可以使用:
const obs = subject
.do(console.log)
.publish()
.refCount();
或者这......
const multicast = new Subject();
const obs = subject
.do(console.log)
.subscribe(multicast);
multicast.subscribe(...);
或者这......
const obs = subject
.do(console.log)
.publish();
obs.connect();
或其他任何取决于你需要的东西。
这只需要一个do()
:
1
next: 1
next: 1