我正在使用服务每2.5秒“ping”一次我的服务器,从我的服务器返回响应时间。因此我使用的是可观测量。
我也使用了角度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();
}
}
我在appcomponent的cunstructor中订阅了PingService。 数据显示在图表中。当我第一次单击该按钮时,它会停止服务,不再有数据更新。当我下次点击时,没有任何反应,尽管“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”。
任何帮助表示赞赏!谢谢!
答案 0 :(得分:5)
由于您使用的是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);