在Angular和rxjs map函数

时间:2017-08-22 02:33:49

标签: javascript angular rxjs

我正在进行Angular课程,我需要使用Http从服务器获取数据。我有一个名为interface的{​​{1}},我有一个应该得到这些事件的服务:

IEvent

然而,当我有这个代码时,我看到一个错误说:

import { Observable } from 'rxjs/Observable';
import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import 'rxjs/observable/throw';

@Injectable()
export class EventService {
  constructor(
    private _http: Http,
    @Inject(...) private _originUrl: string // This is listed in 'providers' in my module
  ) {}

  getEvents() {
    return this._http.get(`${this._originUrl}/api/events`)
      .map((response: Response) => <IEvent[]>response.json())
      .catch(this.handleError_);
  }

  handleError_(error: Response): Observable<string> {
    return Observable.throw(error.statusText);
  }
}

如果我颠倒 TS2322: Type 'Observable<string | IEvent[]>' is not assignable to type 'Observable<IEvent[]>'. Type 'string | IEvent[]' is not assignable to type 'IEvent[]'. Type 'string' is not assignable to type 'IEvent[]'. map的顺序:

catch

或者,如果我删除了JSON响应的类型断言:

return this._http.get(`${this._originUrl}/api/events`)
  .catch(this.handleError_)
  .map((response: Response) => <IEvent[]>response.json());
一切似乎都运转良好。有人可以解释一下这里发生了什么,也许可以提供一些链接,以便我对此有更深入的了解吗?

提前致谢

1 个答案:

答案 0 :(得分:2)

问题是您的handleError方法被声明为返回Observable<string>,因此getEvents中有两条可能的路径:一条返回Observable<IEvent[]>,另一条返回{ {1}}。

这就是你看到Observable<string>的原因。

您的错误处理程序实际上并未返回该类型的observable;它返回一个始终重新抛出错误的observable,该错误的值是一个字符串。抛出不是Observable<string | IEvent[]>实例的错误是否是一种良好的做法,这是值得怀疑的。我不认为是。

Error返回的observable指定的类型是指为handleError通知发出的值的类型 - 而不是错误的类型。您可以解决将签名更改为:

的问题
next

或者:

handleError_(error: Response): Observable<IEvent[]> {
  return Observable.throw(error.statusText);
}

我建议抛出handleError_(error: Response): Observable<any> { return Observable.throw(error.statusText); } 而不是字符串。

如果没有类型断言,则不会出现此问题,因为Error的返回类型为json() - 与any兼容。