Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Angular和rxjs映射函数中使用类型断言_Javascript_Angular_Rxjs - Fatal编程技术网

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_);