【问题标题】:Angular 5 Get correct Observable type from http request (why is it always Observable<Object>?)Angular 5 从 http 请求中获取正确的 Observable 类型(为什么它总是 Observable<Object>?)
【发布时间】:2018-07-24 14:04:11
【问题描述】:

我在从 http.get 请求中获取正确的可观察类型时遇到了一些问题。这是我遇到问题的功能:

getMovie(title:string, year:number): Observable<Movie> {
    const params = new HttpParams()
        .set('title', title)
        .set('year', year.toString());
    return this.http.get(this.moviePath, {params})
  }

如您所见,我想使用参数 'title''year' 从我的后端 api 接收和 Observable 类 Movie。问题是响应总是返回类型为Observable&lt;Object&gt; 而不是Observable&lt;Movie&gt;

我知道我可以创建一个新的 Movie 实例,为其提供从列表中收到的属性。问题在于我的电影类具有可选的属性。这是我的电影课:

export class Movie {
  title:string;
  year?:number;
  imdb?:string;
  trailer?:string;
  reviewClip?:string;
  reviewSummary?:string;
  reviewScore:number;
  createdAt?:Date;
  bestWeek:boolean;
  bestMonth:boolean;
}

有没有人知道一种简单的方法来获得Observable&lt;Movie&gt;而不是Observable&lt;Object&gt;类型的响应

【问题讨论】:

    标签: angular observable angular5 angular-httpclient angular-observable


    【解决方案1】:

    如果你使用的是HttpClient & Http,它会自动返回给你 可观察。

    所以修改你的代码为

    import { Injectable } from '@angular/core';
    import { Observable } from 'rxjs/Observable'
    import { HttpClient,HttpHeaders,HttpResponse,HttpParams } from '@angular/common/http';
    
    import { environment } from '../../../../environments/environment';
    import { Movie } from '../models/movie'
    
    
    @Injectable()
    export class MovieService {
    
      constructor(private http:HttpClient) {
    
       }
    
      getMovie(title:string, year:number) {
        const params = new HttpParams()
            .set('title', title)
            .set('year', year.toString());
        return this.http.get<Movie>(this.moviePath, {params})
      }
    }
    

    这将为您提供电影类型的响应

    【讨论】:

    • 在我指定的问题中,我已经收到了一个 Observable。我的问题是我希望 Observable 属于特定类型。不过谢谢
    【解决方案2】:

    也许你可以尝试从 json 响应中进行类型转换。

    一个例子

    public getEmployees(): Observable<IEmployee[]> {  
            return this.http.get(this._repositoryURL)  
                .map((response: Response) =>
    
       { return <IEmployee[]>response.json() })  
                .catch(this.handleError);  
     }  
    

    你的代码

    getMovie(title:string, year:number): Observable<Movie> {
        const params = new HttpParams()
            .set('title', title)
            .set('year', year.toString());
        return this.http.get(this.moviePath, {params}).map((response: Response) => { return <Movie>response.json() })  
                    .catch(this.handleError);
     }
    
     private handleError(errorResponse: Response) {  
            console.log(errorResponse.statusText);  
            return Observable.throw(errorResponse.json().error || "Server error");  
     } 
    

    【讨论】:

    • 很好的答案,我什至不知道打字(虽然我真的很喜欢打字稿,但对角度和打字稿来说还是很陌生)。几个错误(你不可能知道)。 Angular 5 使用 lettable 运算符,因此您必须通过管道映射运算符。我的回复已经是 json 的形式,所以我把它拿掉了(你不可能知道的)。最后,您的错误处理程序向我发送了此消息ERROR in src/app/movie.service.ts(40,54): error TS2339: Property 'error' does not exist on type 'Promise&lt;any&gt;'.,因此我将其删除。除此之外,太棒了! `
    • 我遇到了与错误处理程序相同的问题。很想知道如何以某种方式处理错误。
    猜你喜欢
    • 1970-01-01
    • 2018-01-31
    • 2020-09-24
    • 2018-05-16
    • 2018-11-27
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 2018-11-02
    相关资源
    最近更新 更多