ReactiveX Observable 在我想要的时候触发

ReactiveX Observable to trigger when I want to

我尝试触发 Observable,例如点击和间隔。如何触发?

我尝试了 obs.retry(),但它什么也没做。

constructor(private http: Http) {
    this.obs = this.http.get('http://quotesondesign.com/wp-json/posts?filter[orderby]=rand&filter[posts_per_page]=1');
    obs.subscribe((response) => {
        console.log(response.text());
    })
    setInterval(() => {
        console.log('update');
        this.obs.retry();
    }, 1000)
}

onClick() {
   console.log('click');
   this.obs.retry();
}

想"retry"时必须重新订阅。

当你构建一个可观察对象时,就像你做 this.http.get(...) 一样,你只是在定义你想对数据做什么。所以你说的是 "I want to get the data from the server, then filter out the data I don't want (.filter(...)) and map it to my object definition so I can use it (.map(...))",但还没有执行任何这些操作。

当您 .subscribe() 那个可观察对象时,您就是 运行 您刚刚定义的所有这些操作。所以在这种情况下,你应该这样做:

constructor(private http: Http) {
    this.obs = this.http.get('http://quotesondesign.com/wp-json/posts?filter[orderby]=rand&filter[posts_per_page]=1');

    setInterval(() => {
        console.log('update');
        this.loadPosts();
    }, 1000)
}

loadPosts() {
    this.obs.subscribe((response) => {
        console.log(response.text());
    });
}

onClick() {
    console.log('click');
    this.loadPosts();
}

如果你理解这部分,那么你可以考虑将其变成一个完整的 Rx 解决方案:

constructor(private http: Http) {
    let httpStream = this.http.get('http://quotesondesign.com/wp-json/posts?filter[orderby]=rand&filter[posts_per_page]=1');
    this.clickSubject = new Rx.ReplaySubject(1);

    this.obs = Rx.Observable.interval(1000)
        .merge(this.clickSubject)
        .flatMap(() => httpStream);

    // Note that is not a good practice to have subscribe in constructors, should have this in init() method or something similar.
    this.obs.subscribe(() => {
        console.log(response.text());
    });
}

onClick() {
    console.log('click');
    this.clickSubject.onNext();
}

在这里,我设置了一个每秒滴答的流 (Rx.Observable.interval),将该流与每次点击时产生的流 (this.clickSubject) 连接起来,并将每个滴答映射为httpStream.

的新结果