Javascript 带有take操作符的RxJS开关映射
我有一个方法,它返回以下可观察值Javascript 带有take操作符的RxJS开关映射,javascript,angular,rxjs,Javascript,Angular,Rxjs,我有一个方法,它返回以下可观察值 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
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一次之后,我在第二次submit中看到两个HTTP调用。我的问题是,在这种情况下,take(1)操作符是否同时杀死内部和外部可观察对象 这与
take()
操作符完全无关。您只需通过两条链对同一个源进行两次订阅
然后,take(1)
操作员只接受发出的第一个项目并发送complete
通知
现在您有以下内容:
+-- switchMap --- take --> subscribe()
-- store --+
+-- switchMap --- take --> subscribe()
因此,相同的值被推送到两个不同的链上,这两个链具有两个不同的开关映射
虽然您可能想要这样的东西:
+--> subscribe()
-- store --- switchMap --+
+--> subscribe()
例如,您有这个(而不是do()
您有switchMap()
):
。。。它将打印以下内容。请注意,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();
或者这个
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)为例,是否同时终止外部订阅和内部订阅?@undefined没有内部订阅和外部订阅。当take(1)
收到单个项目时,我会发送complete
通知来处理链(清除观察者数组)。但运营商本身不负责取消任何订阅。