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
.
的新结果
我尝试触发 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
.