【发布时间】:2016-12-27 11:53:49
【问题描述】:
我正在构建一个 Angular2 应用程序,其中一个组件需要进行多个 API 调用,这些调用依赖于之前的调用。
我目前有一项服务,它通过 API 调用来获取电视节目列表。对于每个节目,我需要多次调用不同的 API 来逐步检查结构以确定该节目是否存在于 Plex 服务器上。
API 文档是here
对于每个节目,我需要进行以下调用并获取正确的数据以确定它是否存在:(假设我们有变量<TVShow>, <Season>, <Episode>)
http://baseURL/library/sections/?X-Plex-Token=xyz 会告诉我:
title="TV Shows" key="2"
http://baseURL/library/sections/2/all?X-Plex-Token=xyz&title=<TVShow> 会告诉我:key="/library/metadata/2622/children"
http://baseURL/library/metadata/2622/children?X-Plex-Token=xyz 会告诉我:index="<Season>" key="/library/metadata/14365/children"
http://baseURL/library/metadata/14365/children?X-Plex-Token=xyz 会告诉我:index="<Episode>" 这意味着我的情节存在。
回复是 json 格式,我删除了很多多余的文本。在每个阶段,我都需要检查是否存在正确的字段 (<TVShow>, <Season>, <Episode>),以便它们可以用于下一次调用。如果不是,我需要返回该节目不存在。如果是这样,我可能会想为节目返回一个 id。
我查看了很多示例,包括 promise、async 和 flatmap,但根据我看到的其他示例,我不确定如何解决这个问题。
- How to chain Http calls in Angular2
- Angular 2.0 And Http
- Angular 2 - What to do when an Http request depends on result of another Http request
- Angular 2 chained Http Get Requests with Iterable Array
- nodejs async: multiple dependant HTTP API calls
- How to gather the result of Web APIs on nodeJS with 'request' and 'async'
这是我获取节目列表的内容。 (shows.service.ts)
export class ShowsHttpService {
getShows(): Observable<Show[]> {
let shows$ = this._http
.get(this._showHistoryUrl)
.map(mapShows)
.catch(this.handleError);
return shows$;
}
}
function mapShows(response:Response): Show[] {
return response.json().data.map(toShow);
}
function toShow(r:any): Show {
let show = <Show>({
episode: r.episode,
show_name: r.show_name,
season: r.season,
available : false, // I need to fill in this variable if the show is available when querying the Plex API mentioned above.
});
// My best guess is here would be the right spot to call the Plex API as we are dealing with a single show at a time at this point, but I cannot see how.
return show;
}
这是来自组件的相关代码(shows.component.ts)
public getShows():any {
this._ShowsHttpService
.getShows()
.subscribe(w => this.shows = w);
console.log(this.shows);
}
奖励积分
下面是一些有趣但不必要的明显问题:
- 第一个 API 查询将比等待所有其他查询发生要快得多(4 个查询 * 约 10 次显示)。是否可以返回初始列表,然后在准备好时使用
available状态进行更新。 - 获取
key="2"的第一个 Plex 调用只需执行一次。它可以是硬编码的,但它可以执行一次并记住吗? - 有没有办法减少 API 调用的次数?我可以看到我可以删除显示过滤器,并在客户端上搜索结果,但这也不是很理想。
- 每个节目的 4 次调用必须按顺序进行,但每个节目可以并行查询速度。这可以实现吗?
任何想法将不胜感激!
【问题讨论】:
标签: api http service angular observable