Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带有take操作符的RxJS开关映射_Javascript_Angular_Rxjs - Fatal编程技术网

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
通知来处理链(清除观察者数组)。但运营商本身不负责取消任何订阅。