Как сделать асинхронный HTTP-запрос внутри цикла / карты Angular2 и изменить исходный массив циклов?
Новичок в Angular2 здесь и интересующийся тем, как выполнить этот асинхронный запрос к шаблону массива (не уверен насчет имени шаблона).
Так скажем, я использую Angular2Http
получить плейлист YouTube, который содержитvideoId
в каждом возвращаемом товаре. Затем мне нужно перебрать этот пункт с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-запроса. В качестве первого HTTP ударил API списка поиска YouTube с упорядочением по viewCount. Просто наблюдаемое гнездо, как указано выше, не сохранит первоначальный порядок.
ОБНОВИТЬ
С помощью решения inoabrian я могу успешно достичь вышеупомянутых трех пунктов. Но когда я снова вызываю myvideoservice (как, например, изменение URL-адреса как нового NextPageToken), у Subject - this._videoObject есть 2 наблюдателя. И снова загрузите, у него есть 3 наблюдателя и так далее. Мне нужен способ сбросить тему, чтобы иметь только 1 наблюдателя, чтобы у меня не было дубликатов видео. Это лучший способ очистки / сброса предмета?