我正在尝试使用Observables
在Angular 2中进行轮询。我知道还有其他一些答案,但是我不能让它为我工作。
我知道这是一个纯粹的理解,所以对答案(它的作用和原因)以及纯代码的解释将不胜感激。
test.service.ts
@Injectable()
export class EtlService {
constructor(private http: Http) { }
//Get ETL by status
get(): Observable<EtlByStatus> {
var url = 'someURL';
return this.http
.get(url)
.map(response => {
return {
headers: response.json().data.headers,
dataSet: response.json().data.data
}
});
}
通过简单的订阅调用此服务可以正常工作:
this._service
.get()
.subscribe(
res=> {
this.headers= res.headers;
this.data = res.dataSet;
});
但是,我的问题是民意调查。我可以告诉我,应该在Component
内进行轮询,以使服务更加可重用 - HTTP请求很简单,并且可以通过多种方式进行处理。
test.component.ts
pollGet(timer: number = 30000): Observable<GetInterface> {
return Observable.interval(timer)
.switchMap((res) => {
this._service.get();
})
.map(res => res)
.subscribe(res => {
console.log('testing');
})
}
以上内容会返回res => void is not assignable
和type void is not assignable to type ObservableInput
。我尝试将中间的get行转换为return,这会产生更多错误并返回subscribe
是函数的消息。
因此,您如何使用Observables
进行投票?我确信我对map
,switchMap
和subscribe
的理解以及它们如何作为observable
的一部分发挥作用,但我无法理解。
答案 0 :(得分:1)
您的函数pollGet
正在根据可重用原则返回Observable<GetInterface>
,因此最终订阅不适合此处,因为它会将返回类型转换为{{ 1}}。
关于subscription
:
switchMap
用于组合可观察链,switchMap
中的 Observable 基于原始Observable的结果。所以在这里你应该在switchMap
中返回Observable类型。
根据您的代码,switchMap
中的observable与任何原始可观察结果无关,因此您只需使用switchMap
。
所以最终的工作代码块如下:
map
答案 1 :(得分:0)
您的地图需要位于switchMap内。我相信switchMap在这里是正确使用的,因为你想要返回一个新的observable,而不是间隔发出的整数。您需要做的是附加地图以处理http /服务响应。
pollGet(timer: number = 30000): Observable<GetInterface> {
return Observable.interval(timer)
.switchMap((intervalCounter) => {
return this._service.get() // note that you need a return here, or inline return
.map(res => res);
})
.subscribe(res => {
console.log('testing');
})
}