Como fazer uma solicitação HTTP assíncrona dentro de um loop / mapa Angular2 e modificar a matriz de loop original?
Novo no Angular2 aqui e imaginando como fazer essa solicitação assíncrona no padrão de matriz (não tenho tanta certeza sobre o nome do padrão).
Então, digamos que eu use o Angular2Http
para obter uma lista de reprodução do YouTube que contémvideoId
em cada item de devolução. Então eu preciso percorrer esse item com ovideoId
e faça outra solicitação ao YouTube para obter as informações de vídeo individuais. Essa pode ser outra solicitação HTTP comum, obtenha a lista, percorra a lista e obtenha os detalhes de cada item individual.
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.
});
});
});
Portanto, o código acima funciona. Mas ainda tenho essas duas perguntas:
Como faço para participar dovideoData
de volta adata.items
e verifique se o item correto dentro dodata.items
está associado com o corretovideoData
(avideoData
que está usando oentry.id.videoId
do item relacionado dentrodata.items
) e crie esse novonewArray
?
Como sei quando tudo está pronto e faço algo com base em todos os dados após a conclusão de todas as solicitações assíncronas?
O newArray mantém a mesma ordem da primeira solicitação HTTP. Quando o primeiro HTTP atingiu a API da lista de pesquisa do YouTube, solicite por viewCount. Simplesmente aninhar o observável como acima não manterá a ordem original.
ATUALIZAR
Com a solução inoabriana, posso alcançar com sucesso os três pontos acima. Mas quando ligo novamente para o myvideoservice (como alterar o URL como novo NextPageToken), o Assunto - this._videoObject tem 2 observadores. E carregue novamente, tem 3 observadores e assim por diante. Preciso de uma maneira de redefinir o Assunto para ter apenas 1 observador, para não ter vídeos duplicados. É uma maneira de prática recomendada para limpar / redefinir o assunto?