Javascript 在Angular和rxjs映射函数中使用类型断言
我正在做一个角度课程,在这个课程中,我需要使用Javascript 在Angular和rxjs映射函数中使用类型断言,javascript,angular,rxjs,Javascript,Angular,Rxjs,我正在做一个角度课程,在这个课程中,我需要使用Http从服务器获取数据。我定义了一个名为IEvent的接口,我还有一个应该获取事件的服务: import { Observable } from 'rxjs/Observable'; import { Injectable } from '@angular/core'; import { Http, Response } from '@angular/http'; import 'rxjs/add/operator/map'; import 'rx
Http
从服务器获取数据。我定义了一个名为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);
}
}
或者,如果删除JSON响应的类型断言:
return this._http.get(`${this._originUrl}/api/events`)
.map((response: Response) => response.json())
.catch(this.handleError_);
一切似乎都很顺利。有人能解释一下这里发生了什么,也许能提供一些链接,让我更深入地了解这一点吗
提前感谢问题是您的
handleError
方法被声明为返回可观察
,因此在getEvents
中有两个可能的路径:一个返回可观察
,另一个返回可观察
这就是为什么您会看到可见的
您的错误处理程序实际上并没有返回该类型的可观察对象;它返回的是一个可观察对象,它总是返回一个错误,该错误的值是一个字符串。抛出一个不是错误
实例的错误是否是一个好的实践是值得怀疑的。我不认为是这样。
为handleError
返回的可观察对象指定的类型指的是下一次通知将发出的值的类型,而不是错误的类型。您可以通过将签名更改为以下内容来解决此问题:
handleError_389;(错误:响应):可观察{
返回Observable.throw(error.statusText);
}
或:
handleError_389;(错误:响应):可观察{
返回Observable.throw(error.statusText);
}
我建议抛出错误
,而不是字符串
如果没有类型断言,问题就不会出现,因为json()
的返回类型是any
——它与string
兼容,谢谢您的回答。我将handleError\uuu
的返回类型更改为Observable
(因为我在获取多个事件或单个事件时使用了相同的错误处理程序),并且它似乎正在工作。所以,按照您的建议,如果我想抛出一个错误
,我应该这样做:返回Observable.throw(新错误(Error.statusText))代码>。这是对的吗?是的。不过,在访问statusText
之前,您可能需要对错误进行更多检查。例如,如果没有连接,请求甚至不会发送到服务器,因此不会出现statusText
,等等。是的,JSON
响应的格式是可以的,我认为原因不是您提到的,因为我在编写代码时在VSCode中遇到了错误,因此,它与应用程序的流程无关(即进入catch
块,而不是进入map
)
return this._http.get(`${this._originUrl}/api/events`)
.catch(this.handleError_)
.map((response: Response) => <IEvent[]>response.json());
return this._http.get(`${this._originUrl}/api/events`)
.map((response: Response) => response.json())
.catch(this.handleError_);