Http Service使用observable进行轮询

时间:2017-05-18 01:22:33

标签: angular observable rxjs5

我正在尝试使用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 assignabletype void is not assignable to type ObservableInput。我尝试将中间的get行转换为return,这会产生更多错误并返回subscribe是函数的消息。

因此,您如何使用Observables进行投票?我确信我对mapswitchMapsubscribe的理解以及它们如何作为observable的一部分发挥作用,但我无法理解。

2 个答案:

答案 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');
    })
}