我需要使用HTTP库来检查服务器上是否存在文件。它非常简单,我所做的就是调用以下代码:
private serverHeadRequest(): Observable<any> {
return this.http.head("theFileName.xxx")
.map(this.isResponseOkCallBack)
.catch(this.handleError);
}
private isResponseOkCallBack(res: Response) {
switch (res.status) {
case 404:
return false;
case 200:
return true;
default:
return false;
}
}
private handleError(error: any) {
let errMsg = (error.message) ? error.message :
error.status ? `${error.status} - ${error.statusText}` : 'Server error';
console.error(errMsg); // log to console instead
return Observable.throw(errMsg);
}
如果响应是200,则代码运行良好。但是,我想简单地在任何其他类型的响应代码上返回false。
我尝试将此作为替代错误处理程序,如果出现错误,我认为只会返回false,但这并不起作用。
private handleError(error: any) {
return Observable.create()
.map({
return false;
});
}
我怎样才能使这个工作?有没有办法忽略某些状态代码?
非常感谢
JT
答案 0 :(得分:4)
尝试认为你可以像这样处理错误:
// import 'rxjs/add/observable/of'
handleError() {
return Observable.of(false);
}
另请注意,如果出现错误,浏览器仍会在控制台中打印HEAD <url> 404 (Not Found)
。你不应该担心这一点,最重要的是你正确处理它(但返回false
)。
答案 1 :(得分:1)
如果出现错误(大多数非2xx响应都会抛出),则isResponseOkCallBack
不会被调用,因为它会直接跳转到.catch()
块。
尝试将所有成功请求映射为true,将任何错误映射为false。
this.http.head("theFileName.xxx")
.map(() => true) // or .map(res => (res.status === 200))
.catch(() => Observable.of(false));
答案 2 :(得分:0)
这就是我最终做的事情:
serverHeadRequest(): Observable<any> {
return this.http.head('someFileName.xxx')
.map(this.isResponseOkCallBack)
.catch(this.handleHEADError);
}
private isResponseOkCallBack(res: Response) {
switch (res.status) {
case 404:
return false;
case 200:
return true;
default:
return false;
}
}
private handleHEADError(error: any) {
return Observable.of(this.isResponseOkCallBack);
}
非常感谢你的帮助。我很感激。
JT