【问题标题】:Why can't I access property when using switchMap?为什么我在使用 switchMap 时无法访问属性?
【发布时间】:2020-02-13 14:11:07
【问题描述】:

我有一个附加到按钮的方法。用户在输入中输入他们的姓名,当单击按钮时,将显示来自该用户的信息。我打算如何做到这一点在下面解释..

我试图将一个值从一个 Observable 传递到另一个 Observable。我试图从第一个 Observable 获得的值是一个 ID,然后在第二个 Observable 中使用。

我目前的做法是使用 switchMap 操作符。但是,当将 ID 从第一个 Observable 传递到第二个时,我在控制台中看到“未定义”..

我在想我在调用第一个 Observable 时没有正确访问 ID。或者我不应该使用 switchMap ?

这也很奇怪,我以为我很接近,因为使用 Object.keys(player)['0'] 我可以获得第一个 Object 键(数据)。但是使用 Object.keys(player)['0'].id;未定义:/

这是我试图从中获取 ID 的响应对象:

我的组件中的点击功能:

click() {
  this.playerService.getPlayer(this.searchString).pipe(
      switchMap(player => {
        let ID = Object.keys(player)['0'];
        let anotherID = ID['0'].id;

        return this.playerService.getSeasonStats(anotherID);
      }))
    .subscribe(id => this.player = id)
}

带有 getPlayer 方法和 getSeasonStats 方法的服务:

getPlayer(query: string):Observable<Player> {
  let getHeaders = new HttpHeaders({'Authorization':'Bearer API_Key', 'Accept': 'application/vnd.api+json'}); 
  return this.http.get<Player>(`https://api.com/shards/steam/players?filter[playerNames]=${query}`, {
    observe:'body',
    responseType: 'json',
    headers: getHeaders
  });
}


getSeasonStats(id: string):Observable<SeasonStats[]> {
  let getHeaders = new HttpHeaders({'Authorization':'Bearer API_Key', 'Accept': 'application/vnd.api+json'}); 
  return this.http.get<SeasonStats[]>(`https://api.com/shards/steam/players/${id}/seasons/division.bro.official.pc-2018-04`,  {
    observe:'body',
    responseType: 'json',
    headers: getHeaders
  });
}

【问题讨论】:

  • 澄清一下,switchMap 中的 player 参数未定义?还是ID
  • 将 (anotherID) 传入 getSeasonStats 变得未定义。 ID['0'] 返回 'Data' Key 的方式与变量 ID 返回 Data 的方式相同。尝试使用 ID = Object.keys(player['0']) 时遇到 Typescript 错误,因此我创建了变量 anotherID 以便可以使用 ['0'].id
  • 啊,很抱歉对您的问题进行了令人困惑的冗长解释

标签: javascript angular angular7 switchmap


【解决方案1】:

你的问题是:

let ID = Object.keys(player)['0'];
let anotherID = ID['0'].id;

Object.keys(player)['0'] 行以字符串形式返回"data",现在执行['0'] 你得到“d”...所以你的结果是"d".id =&gt; undefined

也许您需要执行以下操作:

let playerData = player["data"][0];
let anotherID = playerData.id;

【讨论】:

  • ooo,我回家后试试这个。谢谢你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 2012-10-30
  • 1970-01-01
  • 2021-10-26
  • 2020-09-01
  • 1970-01-01
相关资源
最近更新 更多