带有take运算符的RxJS switchMap

时间:2017-06-23 15:21:00

标签: javascript angular rxjs

我有一个返回以下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)运算符是否同时杀死内部外部可观察对象?

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