这里是 Angular2 的新手,想知道如何对数组模式执行此异步请求(不太确定模式名称)。
因此,假设我使用 Angular2Http
获取包含videoId
在每个返回项目中的 YouTube 播放列表。然后,我需要使用 循环浏览此项目,videoId
并向 YouTube 发出另一个请求以获取各个视频信息。这可以是另一个常见的 HTTP 请求,获取列表然后遍历列表并获取每个单独项目的详细信息。
let url = [YouTube API V3 list url]
let detailUrl = 'https://www.googleapis.com/youtube/v3/videos?part=contentDetails,statistics';
this.http.get(url)
.map(res => res.json())
.subscribe(data => {
let newArray = data.items.map(entry => {
let videoUrl = detailUrl + '&id=' + entry.id.videoId +
'&key=' + this.googleToken;
this.http.get(videoUrl)
.map(videoRes => videoRes.json())
.subscribe(videoData => {
console.log(videoData);
//Here how to I join videoData into each item inside of data.items.
});
});
});
所以上面的代码确实有效。但我仍然有这两个问题:
我如何加入
videoData
后面data.items
并确保里面的正确项目data.items
与正确videoData
的(videoData
使用entry.id.videoId
里面相关项目的data.items
)连接并创建新的newArray
?在所有异步请求完成后,我如何知道一切何时完成并根据所有数据执行某些操作?
newArray 保持与第一个 HTTP 请求相同的顺序。作为第一个按 viewCount 排序的 HTTP 访问 YouTube 搜索列表 API。像上面这样简单地嵌套 observable 不会保持原始顺序。
更新
使用inoabrian解决方案,我可以成功实现以上三点。但是当我再次调用 myvideoservice(比如将 url 更改为新的 NextPageToken)时,Subject - this._videoObject 有 2 个观察者。再次加载,它有 3 个观察者,依此类推。我需要一种方法将主题重置为只有 1 个观察者,这样我就不会有重复的视频。这是清除/重置主题的最佳实践方式吗?