我的提供商可为http.get
请求提供API:
join(){
let headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append('x-access-token',this.getToken());
return Observable.create(observer =>{
this.http.get('/localhost/chat/'+this.room,{headers : headers})
.map(res => res.json())
.subscribe(
data=>{
observer.next(data);
},
(err) =>{
observer.error(err);
}
);
})
}
我的page.ts
只需周期性地使用此API:
join(){
this.myProvider.join().subscribe(
(data)=>{
if(data.success){
... /* doing smt */ ....
this.join();
}else{
this.message=data.message;
//TBD sleep....
//this.join();
}
},
(err) => {
this.message="Connectivity with server Lost...";
});
}
我的问题是:我想在page.ts
中编写一个函数,以停止此周期。我该如何杀死待定请求?
一个不起作用的解决方案是我试图在我的page.ts
中保留一个指向可观察到的对象的指针:
export class Page {
...
join_channel: any;
join(){
this.join_channel = this.myProvider.join().subscribe(
(data)=>{
...
this.join();
...
然后我通过调用this.join_channel.unsubscribe()
我想关闭请求,因此,在我的情况下:
ionViewWillLeave() {
this.join_channel.unsubscribe();
delete this;
}
但是,即使是取消订阅,获取请求仍在那里;因此,当我尝试在页面上再次输入时,新的join()
无法在第一步中收到http。Div>
使用RXJS
的超时this.http.get(API)
.timeout(2000)
.map(res => res.json()).subscribe((data) => {
return data;
},
(err) => {
return err;
}
);
不要忘记导入import 'rxjs/add/operator/timeout';
如果您使用的是angular 6
,则必须使用
管道(超时(2000))
this.http.get(API)
.pipe(timeout(2000))
.map(res => res.json()).subscribe((data) => {
return data;
},
(err) => {
return err;
}
);