我有一个简单的方法来检查本地计算机中是否存在*.mp3
文件。
应该返回响应的 status
(200,404,403等),但它不起作用。
fileExists(url){
return this.http.get(url).timeout(2000)
.map(res=>res.json())
.subscribe(
res=>{
console.log("res is");
console.log(res.status)
return res.status;},
err =>{
console.log("Error is");
console.log(err.status);
return err.status});
}
我为它设置了2秒的超时,但是它只需要检查我的localhost中的文件。因此,我认为,它有足够的时间来查找文件。
它总是返回:
Subscriber {closed: false, syncErrorValue: null, syncErrorThrown: false, syncErrorThrowable: false, isStopped: false…}
答案 0 :(得分:2)
如果要编写一个发出GET
请求状态代码的observable,可以执行以下操作:
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/map';
this.http.get("/some-file.txt")
.map((response) => response.status)
.catch((error) => Observable.of(error.status || 404))
.subscribe((status) => console.log(`status = ${status}`));
如果您想基于HTTP状态代码更有效地确定文件的存在,可以使用HEAD
方法,该方法不会检索文件的内容:
this.http.head("/some-file.txt")
.map((response) => response.status)
.catch((error) => Observable.of(error.status || 404))
.subscribe((status) => console.log(`status = ${status}`));
您的问题中的代码问题在于您在响应中查找JSON内容,并且正在该内容中查找status
。 status
在响应中。
但是,要实现确定文件存在的函数,您甚至不需要检查status
:
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/mapTo';
import 'rxjs/add/operator/toPromise';
getFileStatus(path: string): Promise<boolean> {
return this.http.head(path)
.mapTo(true)
.catch((error) => Observable.of(false))
.toPromise();
}