Это немного загруженный вопрос, но я думаю, что мы можем разбить его на три основных вопроса:
1.Как ограничить количество историй, возвращаемых API хакерских новостей?
Поскольку данные хакерских новостей предоставляются через API Firebase, давайте обратимся к документации Firebase.Как указано здесь , мы можем использовать опции limitToFirst и orderBy вместе, чтобы ограничить количество результатов.Мы можем просто заказать по ключу, поэтому URL вашего запроса будет выглядеть примерно так:
'https://hacker-news.firebaseio.com/v0/beststories.json?
print=pretty&orderBy="$key"&limitToFirst=30'
2.Как вы связываете HTTP-запросы в Angular (делаете второй запрос, который зависит от результата первого)?
Этого можно достичь с помощью оператора mergeMap
rxjs .Этот оператор позволяет отобразить значения, испускаемые наблюдаемой, другой наблюдаемой.Чтобы упростить ситуацию, представьте, что ваш первоначальный запрос состоял в том, чтобы вернуть только один идентификатор.Затем мы могли бы использовать mergeMap
для сопоставления идентификатора с запросом полного элемента.
Если бы эта конечная точка существовала по пути beststory.json
, она выглядела бы примерно так: например:
this.http.get('https://hack...v0/beststory.json').pipe(
mergeMap((id) => this.http.get(`https://hack.../v0/item/${id}`))
).subscribe((data) => {
console.log('Story: ', data);
}
Поскольку вам необходимо сопоставить несколько запросов, нам нужно будет ввести еще один оператор, описанный в вопросе 3.
3.Как выполнить несколько HTTP-запросов одновременно (сделать запрос для каждого элемента в списке)?
Этого можно достичь с помощью оператора forkJoin
rxjs.Этот оператор принимает массив наблюдаемых и выдает массив их значений, как только они завершены.В контексте вашей проблемы входные данные представляют собой массив запросов (по одному для каждого идентификатора в начальном запросе), а выходные данные представляют собой список элементов.Чтобы снова упростить ситуацию, давайте предположим, что у вас уже есть массив идентификаторов.Выдача запросов для каждого элемента в списке будет выглядеть примерно так:
let ids = [1, 2,...];
forkJoin(ids.map((id) => this.http.get(`https://hack.../v0/item/${id}`)).subscribe((stories) => {
console.log('Stories:', stories);
});
Собираем все вместе
Теперь, когда мы знаем, как отобразить результатзапрос к другой наблюдаемой с mergeMap
, и мы знаем, как объединить результаты нескольких наблюдаемых в одну с forkJoin
, мы можем использовать их вместе для достижения того, что вы ищете:
this.http.get('https://hack....v0/beststories.json?orderBy="$key"&limitToFirst=30').pipe(
mergeMap((ids) => forkJoin(ids.map((id) => this.http.get(`https://hack...v0/item/${id}`)))),
).subscribe((stories) => {
console.log('Stories:', stories);
});
Обратите внимание, что в фрагментах кода я исключил часть URL-адреса и не связанных между собой параметров запроса