使用 angular 和 rxjs 的可配置轮询间隔
Configurable polling interval with angular and rxjs
我正在尝试使用 rxjs 和 angular 创建连续轮询。下面是我的要求的实现。
https://stackblitz.com/edit/angular-sq3ke5
ngOnInit() {
const bitcoin$ = this.http.get('https://blockchain.info/ticker');
this.polledBitcoin$ = timer(0, this.timeInterval).pipe(
merge(this.manualRefresh),
concatMap(_ => bitcoin$),
map((response: {EUR: {last: number}}) => {
console.log(new Date() +" >> " + response.EUR.last)
return response.EUR.last;
}),
);
}
但是在这个例子中,我添加了轮询间隔,我希望它根据用户输入的值进行更新。但是,文本输入的任何更改都不会反映在轮询间隔中。
有人可以帮我实现这个结果吗?
提前致谢。
更新 timeInterval
变量不会简单地更新你的 interval
Observable,你必须杀死它并启动一个新的 Observable。
试试这个方法:
<input [ngModel]="timeInterval" (ngModelChange)="changeInterval($event)" />
Bitcoin price: {{ dataToShow }}
ngOnInit() {
this.startInterval();
}
startInterval() {
const bitcoin$ = this.http.get('https://blockchain.info/ticker');
this.polledBitcoin$ = timer(0, this.timeInterval).pipe(
merge(this.manualRefresh),
concatMap(_ => bitcoin$),
map((response: {EUR: {last: number}}) => {
console.log(new Date() +" >> " + response.EUR.last)
return response.EUR.last;
}),
);
this.sub = this.polledBitcoin$.subscribe((data) => {
this.dataToShow = data;
});
}
changeInterval(e) {
this.timeInterval = e;
if (this.sub) {
this.sub.unsubscribe();
}
this.startInterval();
}
https://stackblitz.com/edit/angular-4n29cm?file=app%2Fapp.component.ts
编辑
一种更高效的方法是等待输入更改,然后再次重新创建间隔。我使用了一个 Subject 来监听输入的变化,等待一段时间让用户完成输入然后重新开始间隔。
ngOnInit() {
this.startInterval();
this.inputSub = this.inputSubject.pipe(debounceTime(500)).subscribe(() => {
console.log('restart now')
if (this.intervalSub) {
this.intervalSub.unsubscribe();
}
// you probably don't want an interval running in zero second interval
// add more checks here if you want, for example: this.timeInterval > 200
if (this.timeInterval) {
this.startInterval();
}
})
}
startInterval() {
const bitcoin$ = this.http.get('https://blockchain.info/ticker');
this.polledBitcoin$ = timer(0, this.timeInterval).pipe(
merge(this.manualRefresh),
concatMap(_ => bitcoin$),
map((response: {EUR: {last: number}}) => {
console.log(new Date() +" >> " + response.EUR.last)
return response.EUR.last;
}),
);
this.intervalSub = this.polledBitcoin$.subscribe((data) => {
this.dataToShow = data;
});
}
changeInterval(e) {
console.log("change interval called");
this.timeInterval = e;
this.inputSubject.next(e);
}
https://stackblitz.com/edit/angular-c355ij?file=app%2Fapp.component.ts
我正在尝试使用 rxjs 和 angular 创建连续轮询。下面是我的要求的实现。
https://stackblitz.com/edit/angular-sq3ke5
ngOnInit() {
const bitcoin$ = this.http.get('https://blockchain.info/ticker');
this.polledBitcoin$ = timer(0, this.timeInterval).pipe(
merge(this.manualRefresh),
concatMap(_ => bitcoin$),
map((response: {EUR: {last: number}}) => {
console.log(new Date() +" >> " + response.EUR.last)
return response.EUR.last;
}),
);
}
但是在这个例子中,我添加了轮询间隔,我希望它根据用户输入的值进行更新。但是,文本输入的任何更改都不会反映在轮询间隔中。 有人可以帮我实现这个结果吗?
提前致谢。
更新 timeInterval
变量不会简单地更新你的 interval
Observable,你必须杀死它并启动一个新的 Observable。
试试这个方法:
<input [ngModel]="timeInterval" (ngModelChange)="changeInterval($event)" />
Bitcoin price: {{ dataToShow }}
ngOnInit() {
this.startInterval();
}
startInterval() {
const bitcoin$ = this.http.get('https://blockchain.info/ticker');
this.polledBitcoin$ = timer(0, this.timeInterval).pipe(
merge(this.manualRefresh),
concatMap(_ => bitcoin$),
map((response: {EUR: {last: number}}) => {
console.log(new Date() +" >> " + response.EUR.last)
return response.EUR.last;
}),
);
this.sub = this.polledBitcoin$.subscribe((data) => {
this.dataToShow = data;
});
}
changeInterval(e) {
this.timeInterval = e;
if (this.sub) {
this.sub.unsubscribe();
}
this.startInterval();
}
https://stackblitz.com/edit/angular-4n29cm?file=app%2Fapp.component.ts
编辑
一种更高效的方法是等待输入更改,然后再次重新创建间隔。我使用了一个 Subject 来监听输入的变化,等待一段时间让用户完成输入然后重新开始间隔。
ngOnInit() {
this.startInterval();
this.inputSub = this.inputSubject.pipe(debounceTime(500)).subscribe(() => {
console.log('restart now')
if (this.intervalSub) {
this.intervalSub.unsubscribe();
}
// you probably don't want an interval running in zero second interval
// add more checks here if you want, for example: this.timeInterval > 200
if (this.timeInterval) {
this.startInterval();
}
})
}
startInterval() {
const bitcoin$ = this.http.get('https://blockchain.info/ticker');
this.polledBitcoin$ = timer(0, this.timeInterval).pipe(
merge(this.manualRefresh),
concatMap(_ => bitcoin$),
map((response: {EUR: {last: number}}) => {
console.log(new Date() +" >> " + response.EUR.last)
return response.EUR.last;
}),
);
this.intervalSub = this.polledBitcoin$.subscribe((data) => {
this.dataToShow = data;
});
}
changeInterval(e) {
console.log("change interval called");
this.timeInterval = e;
this.inputSubject.next(e);
}
https://stackblitz.com/edit/angular-c355ij?file=app%2Fapp.component.ts