我想用angular应用程序在我的nativescript中实现轮询。我想每秒检查一下后端服务器的状态。我有这项服务:
@Injectable()
export class StateService {
getStatus(): Observable<StateApp> {
let headers = this.getHeaders();
return this.http
.get(BackendService.stateUrl, {
headers: headers
})
.map(res => {
return res.json() as StateApp
})
.catch(this.handleErrors);
}
然后我想隐瞒这项服务并向服务器发送请求。在我组件的组件中,我有以下代码:
IntervalObservable.create(1000).subscribe(() => {
this.statusService.getStatus()
.subscribe(
(next) => {
this.state = next;
};
});
我试图实现我在这里阅读的解决方案,并处理同样的问题(但它是近2年前的帖子)Angular2 http at an interval但是例如当我写IntervalObservable.takeWhile时它并没有& #39; t不再存在(rxjs版本5.4.3)。所以我想知道实现相同结果的方法是什么(即第一次不等待一秒钟来获得结果并在组件被销毁时停止发送请求)
答案 0 :(得分:8)
您可以使用rxjs interval operator并实施投票。以下实现将每1000毫秒间隔执行this.statusService.getStatus()
行:
this.subscription = Observable.interval(1000).startWith(1)
.mergeMap(() => this.statusService.getStatus())
.subscribe((next) => {
this.state = next;
})
添加了startWith(1)
的更新,现在,它将立即执行,没有任何延迟,之后每隔1秒执行一次。 我想这就是你想要的。
或另一种方法:您可以使用timer operator并执行以下操作:
this.subscription = Observable.timer(0, 1000)
.mergeMapTo(this.statusService.getStatus())
.subscribe((next) => {
this.state = next;
}, (errRes)=>{
console.log(errRes);
});
在这种方法中,计时器操作员将立即执行,之后每1000毫秒执行一次。
取消订阅Observable组件ngOnDestroy生命周期钩子。
ngOnDestroy(){
this.subscription.unsubscribe();
}
也不要忘记导入:
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/operator/mergeMap';
import 'rxjs/add/operator/startWith';
import 'rxjs/add/operator/mergeMapTo';
import 'rxjs/add/observable/timer';