Fai*_*jaz 4 rxjs typescript angular
我正在使用服务每2.5秒“ ping”我的服务器,并从我的服务器返回响应时间。因此,我正在使用观测值。
我也使用angular 2和打字稿。
现在,我想在单击按钮时停止该服务(退订)。这样很好!该按钮应该是一个切换按钮,因此,如果未订阅,请进行订阅以及其他方式。但是重新订阅是行不通的!
这是我的服务:
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);
});
});
}
}
Run Code Online (Sandbox Code Playgroud)
这是我点击的功能:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
我正在我的appcomponent的构造函数内订阅PingService。数据显示在图表中。当我第一次单击该按钮时,它将停止该服务,不再有数据更新。下次单击时,什么都没有发生,尽管“ this.pingService.pingStream.isUnsubscribescribed”返回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);
})
}
Run Code Online (Sandbox Code Playgroud)
当我第一次单击该按钮时,还会出现错误“ 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);
Run Code Online (Sandbox Code Playgroud)
参见小提琴样本
| 归档时间: |
|
| 查看次数: |
3385 次 |
| 最近记录: |