Сделайте следующее действие небольшим
Предположим, иллюстративное туристическое приложение ищет offline maps в hiking с limit=3 и page=1. Читатель открывает полученные материалы и решает, полезна ли ещё одна группа. «Показать ещё» должно запрашивать следующую страницу того же вопроса, а не незаметно обходить все страницы или менять запрос, оставляя на экране старые результаты.
Визуальная подсказка — элемент «Показать ещё», возникающий, когда ответ допускает следующую страницу. Пока действие выполняется, отключайте повторное нажатие и оставляйте показанные материалы доступными. Каждый успешный запрос страницы расходует один кредит, включая пустую страницу. Отказавшись от следующей страницы, читатель избегает будущего запроса; уход с экрана не гарантирует отмены или возврата за уже отправленный.
Храните состояние запроса вместе
При увеличении page сохраняйте q, subreddit, другие выбранные фильтры и limit. Если читатель меняет фразу или диапазон дат, начните новую последовательность с page=1. Вторая страница другого вопроса, добавленная в старый список, искажает историю чтения, даже если оба запроса успешны.
Архив использует порядок _doc. Это не порядок по времени, релевантности или оценке; min_score — фильтр, а не команда сортировки. Полученные записи можно переупорядочить для показа, но это не выделяет самые новые или лучшие совпадения во всём архиве. Повторные запросы страниц не сопровождаются гарантией стабильного снимка.
Используйте ответ, а не поиск пустой страницы в цикле
pagination.has_more опирается на дополнительную проверочную запись, когда окно запроса позволяет её получить. Предлагайте следующее действие только при has_more=true и номере страницы меньше 100. Не продолжайте загрузки до появления пустой страницы: сервис уже сообщает о продолжении, а лишние успешные запросы расходуют кредиты.
Читайте pagination.total вместе с pagination.relation. eq означает точное количество в рамках правил подсчёта этого ответа; gte — нижнюю границу, а не статистическую оценку; unknown не даёт надёжного итога и может сопровождаться null. В гипотетическом первом ответе с тремя видимыми записями, total=4 и relation=gte можно написать, что указано не менее четырёх совпадений. Нельзя утверждать, что их ровно четыре.
Распознавайте ограниченное окно
Границы — 100 записей на запрос и 100 страниц. На странице 100 с limit=100 полная последняя страница не оставляет места для дополнительной проверочной записи. Поэтому pagination.window_exhausted может быть true одновременно с has_more=false и relation=gte. На этой границе false у has_more не доказывает отсутствие дальнейших совпадений в архиве.
Пустая страница после page=1 также не устанавливает глобальный итог; для такого случая шлюз помечает общее количество как unknown. Объясняйте читателю фактическую границу, например «Достигнута граница этого поискового окна», а не «Загружены все обсуждения». Сужение запроса помогает организовать дальнейшую работу, но не превращает ограниченные запросы в исчерпывающий экспорт.
Объединяйте аккуратно и позволяйте продолжить после ошибки
Если фактический идентификатор записи присутствует, приложение может не показывать одну запись дважды в накапливаемом списке. Выбирайте правила идентичности по действительно полученным полям; не выдумывайте отсутствующий ID и не объединяйте разные записи лишь из-за похожего текста. Локальное устранение повторов не доказывает полноту оставшегося списка.
При неудачном запросе следующей страницы оставьте прежние записи и вопрос нетронутыми и предложите явный повтор. Храните номер ожидаемой страницы отдельно, пока исход не известен, и обрабатывайте нарушенный порядок ответов в логике приложения. API не предоставляет курсорного эндпоинта и не управляет этим состоянием интерфейса. В /ru/#field-notes есть примеры отдельных состояний загрузки и бюджета запросов.