Rxjs - 重新订阅取消订阅Observable
问题描述:
我正在使用服务来每隔2.5秒“ping”我的服务器,从我的服务器返回响应时间。因此我使用observables。Rxjs - 重新订阅取消订阅Observable
我也使用角2和打字稿。
我现在想停止点击按钮上的服务(取消订阅)。这工作得很好!该按钮应该是一个togglebutton,所以如果没有订阅,订阅和其他方式。但重新订阅不起作用!
这里是我的服务:
export class PingService {
pingStream: Subject<number> = new Subject<number>();
ping: number = 0;
url: string = url.href;
constructor(private _http: Http) {
Observable.interval(2500)
.subscribe((data) => {
let timeStart: number = performance.now();
this._http.get(this.url)
.subscribe((data) => {
let timeEnd: number = performance.now();
let ping: number = timeEnd - timeStart;
this.ping = ping;
this.pingStream.next(ping);
});
});
}
}
这里是我的点击功能:
toggleSubscription() {
if (this.pingService.pingStream.isUnsubscribed) {
this.pingService.pingStream.subscribe(ping => {
this.ping = ping;
NTWDATA.datasets[0].data.pop();
NTWDATA.datasets[0].data.splice(0, 0, this.ping);
})
}
else {
this.pingService.pingStream.unsubscribe();
}
}
我订阅的PINGSERVICE我appcomponent的cunstructor内。 数据显示在图表中。当我第一次点击按钮时,它停止服务,不再有数据更新。当我点击下一次,没有任何反应,虽然“this.pingService.pingStream.isUnsubscribed”返回true。
我的构造函数:
constructor(private location: Location,
private pingService: PingService) {
this.pingService.pingStream.subscribe(ping => {
this.ping = ping;
NTWDATA.datasets[0].data.pop();
NTWDATA.datasets[0].data.splice(0, 0, this.ping);
})
}
我也得到一个错误“ObjectUnsubscribedError”当我点击按钮的第一次。
任何帮助表示赞赏!谢谢!
答
由于您使用RxJS,您不必订阅/取消订阅。只需考虑使用Rx流的另一种方法。这个想法是有2个流main
和toggle
流,所以他们结合起来,只有当你的toggle
流打开时才会触发事件。
var mainStream = Rx.Observable.interval(100).map(() => '.');
var toggleStream = Rx.Observable
.fromEvent(toggle, 'change')
.map(e => e.target.checked);
var resultStream = toggleStream
.filter(x => x === true)
.startWith(true)
.flatMap(() => mainStream.takeUntil(toggleStream));
resultStream.subscribe(x => display.innerText += x);
谢谢,这是一个好主意!我没有那么深入rxjs,不会很快注意到这一点。 :)现在我想知道是否可以在Observable.interval中设置不同的值。我希望用户能够设置他们想要的时间间隔。但是,由于可观测值在我的app.component初始化时开始发射数据(我是否正确?),我不太确定这是否可行。 – Faigjaz
@Faigjaz看看这个问题http://*.com/questions/34058398/change-interval-settings-of-observable-after-creation –
我会尽力通过它,谢谢! – Faigjaz