【问题标题】:API Call: returning observable<object>API 调用:返回 observable<object>
【发布时间】:2019-06-07 09:21:03
【问题描述】:

我正在尝试创建一个返回 Observable 的函数。我正在使用以下 API (https://pokeapi.co/api/v2/)。

我的模特:

export class Pokemon {
id: number;
name: string;
height: number;
  weight: number;
  types: PokemonType[];
  image_url: string;
  shiny_url: string;
}

export class PokemonType {
  slot: number;
  name: string;
}

我试过了。但是下面的代码返回一个普通的口袋妖怪,我想返回一个 Observable 以便我可以使用订阅函数。

export class PokemonService {
  API_ADDRESS: string = 'https://pokeapi.co/api/v2/pokemon';

  constructor(private httpClient: HttpClient, private toastService: ToastService) { }


getPokemon(id: number) : Pokemon {
    var result: Pokemon = new Pokemon();
    this.httpClient.get<any>(`${this.API_ADDRESS}/${id}`).subscribe(pokemon => {
      result.id = pokemon.id;
      result.image_url = pokemon.sprites.front_default;
    });
    return result;
  }
}

我发现一堆网站试图解释 API 调用,但有些网站已经过时,我不需要 API 中的所有数据,只需要类中提到的变量。

谁能帮帮我?

【问题讨论】:

    标签: angular typescript ionic-framework


    【解决方案1】:

    试试这个方法

    getPokemon(id: number) : observable<Pokemon>{
    
       return this.httpClient.get<any>(`${this.API_ADDRESS}/${id}`).pipe(map(pokemon => {
          var result: Pokemon = new Pokemon();
          result.id = pokemon.id;
          result.image_url = pokemon.sprites.front_default;
          return result; // ?
        }));
    
      }
    

    现在你只需要订阅getPokemon

    更新!

    万一或错误处理我们可以使用 rxjs catch / catchError

      getPokemon(id: number) {
    
        return this.httpClient.get<any>(`${this.API_ADDRESS}/${id}`).pipe(
          map(pokemon => {
            var result: Pokemon = new Pokemon();
            result.id = pokemon.id;
            result.image_url = pokemon.sprites.front_default;
            return result; // ?
          }),
          catchError(error => throwError(error))
        );
    
      }
    

    stackblitz demo ??

    检查这个RxJs Error Handling: Complete Practical Guide

    【讨论】:

    • 我试过这个,但我得到这个错误:[ng] src/app/api/pokemon.service.ts(23,66) 中的错误:错误 TS2339:属性“地图”确实'Observable' 类型上不存在。我读到你需要使用管道,但我不知道如何。
    • 它有效,谢谢!如何添加错误处理?你需要get还是get
    • 你可以使用catchError操作符learnrxjs.io/operators/error_handling/catch.html
    • 如果我使用 catchError 运算符,我会收到以下错误: src/app/api/pokemon.service.ts(20,5) 中的错误:错误 TS2322: Type 'Observable' 不可分配给类型 'Observable'。 [ng] 键入“任何 [] |口袋妖怪'不可分配给输入'口袋妖怪'。 [ng] 类型 'any[]' 不可分配给类型 'Pokemon'。 [ng] 类型“any[]”中缺少属性“id”。代码:pastebin.com/ZHfpsHPV
    • 我已经更新了答案并添加了处理错误的示例?
    猜你喜欢
    • 2018-05-09
    • 2021-09-14
    • 2017-11-01
    • 2016-12-18
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    相关资源
    最近更新 更多