Angular2:使用http.get检查文件是否存在

Angular2:使用http.get检查文件是否存在,angular,Angular,我有一个简单的方法来检查本地机器中是否存在*.mp3文件。 它应该返回响应的状态(200、404403等),但不起作用 fileExists(url){ return this.http.get(url).timeout(2000) .map(res=>res.json()) .subscribe(

我有一个简单的方法来检查本地机器中是否存在
*.mp3
文件。 它应该返回响应的状态(200、404403等),但不起作用

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秒的超时,但是它只需要检查本地主机中的一个文件。因此,我认为,它有足够的时间找到该文件

它总是返回:

Subscriber {closed: false, syncErrorValue: null, syncErrorThrown: false, syncErrorThrowable: false, isStopped: false…}

如果您想要组成一个发出
GET
请求状态代码的可观察对象,可以执行以下操作:

从'rxjs/Observable'导入{Observable};
导入“rxjs/add/observable/of”;
导入'rxjs/add/operator/map';
this.http.get(“/some file.txt”)
.map((响应)=>response.status)
.catch((错误)=>可观察的(错误状态| | 404))
.subscribe((status)=>console.log(`status=${status}`));
如果您想根据HTTP状态代码更有效地确定文件的存在,可以使用
HEAD
方法,该方法不会检索文件的内容:

this.http.head(“/some file.txt”)
.map((响应)=>response.status)
.catch((错误)=>可观察的(错误状态| | 404))
.subscribe((status)=>console.log(`status=${status}`));
问题中的代码的问题在于,您在响应中查找JSON内容,并且在该内容中查找
状态。
状态在响应本身中

但是,要实现确定文件存在的函数,甚至不需要检查
状态

从'rxjs/Observable'导入{Observable};
导入“rxjs/add/observable/of”;
导入'rxjs/add/operator/mapTo';
导入“rxjs/add/operator/toPromise”;
getFileStatus(路径:string):承诺{
返回此.http.head(路径)
.mapTo(真)
.catch((错误)=>可观察到的(错误))
.toPromise();
}

如果您想要组成一个可观察对象,该对象发出
GET
请求的状态代码,您可以执行以下操作:

从'rxjs/Observable'导入{Observable};
导入“rxjs/add/observable/of”;
导入'rxjs/add/operator/map';
this.http.get(“/some file.txt”)
.map((响应)=>response.status)
.catch((错误)=>可观察的(错误状态| | 404))
.subscribe((status)=>console.log(`status=${status}`));
如果您想根据HTTP状态代码更有效地确定文件的存在,可以使用
HEAD
方法,该方法不会检索文件的内容:

this.http.head(“/some file.txt”)
.map((响应)=>response.status)
.catch((错误)=>可观察的(错误状态| | 404))
.subscribe((status)=>console.log(`status=${status}`));
问题中的代码的问题在于,您在响应中查找JSON内容,并且在该内容中查找
状态。
状态在响应本身中

但是,要实现确定文件存在的函数,甚至不需要检查
状态

从'rxjs/Observable'导入{Observable};
导入“rxjs/add/observable/of”;
导入'rxjs/add/operator/mapTo';
导入“rxjs/add/operator/toPromise”;
getFileStatus(路径:string):承诺{
返回此.http.head(路径)
.mapTo(真)
.catch((错误)=>可观察到的(错误))
.toPromise();
}

返回的状态由您在后端定义。否?否,这是http请求的状态。@Salman,您使用的是什么后端框架?如果您使用的是像apache这样的后端,那么您将把它留给apache来为您提供状态,如果您使用的是像nodejs/django这样的后端,您可能需要定义如何获取文件?返回的状态由您在后端定义。否?否,这是http请求的状态。@Salman,您使用的是什么后端框架?如果您使用的是像apache这样的后端,那么您将把它留给apache来为您提供状态,如果您使用的是像nodejs/django这样的后端,您可能需要定义如何获取文件,但它不会返回任何内容。我需要它返回一个布尔值,如果它找到状态为200的文件,则无法从
subscribe
回调中返回任何内容;它不是那样工作的。您可以使用
toPromise
操作符将合成的可观测值转换为承诺。我已经更新了答案。这可以用于检查文件是否存在,如果不存在则加载其他文件,谢谢。但它不会返回任何内容。我需要它返回一个布尔值,如果它找到状态为200的文件,则无法从
subscribe
回调中返回任何内容;它不是那样工作的。您可以使用
toPromise
操作符将合成的可观测值转换为承诺。我已经更新了答案。这可以用于检查文件是否存在,如果不存在则加载其他文件,谢谢。