@aljo222
В процессе обучения веб-разработке

Как повторять ajax post-запрос до определенного значения ответа или как выполнять php-функцию и возвращать промежуточные результат юзеру?

День добрый!
Не уверен, что это правильное решение, если есть лучше, буду рад подсказкам.
Со страницы делается ajax-запрос, который отлавливается обработчиком. Далее обработчик получает данные с другого моего сайта, обновляет данные и возвращает количество элементов, которые были обновлены и offset.
URL страницы, с которого обработчик получает данные выглядит примерно так:
https://site.com/updateitems?offset=0
За раз страница отдает информацию не более чем о 20 элементах. Т.е. первая партия при offset=0, следующая при offset=20 и т.д.
Можно ли сделать так, чтобы ajax-запрос повторялся до тех пор, пока количество обновленных элементов, которое возвращает обработчик, не будет меньше 20.
Что-то наподобие.
var offset = 0;
$.post(document.location.href, {action: 'updateItems', offset: 0}, function(res) {    	
      var data = JSON.parse(res, true);                 
      if (data.updated == 20) {
             offset = data.offset + 20;
             //повторить ajax-запрос с новым offset
      } else {
             //значит был последний запрос.
      }
});

Правильно ли я понимаю, что нужно писать рекурсивную функцию?

P.S. я был бы не против делать всего один ajax-запрос, а дальше уже все делать в php-обработчике. Но хотелось бы как-то параллельно возвращать промежуточный результат юзеру, мол "Обновились товары с 1 по 20...", далее "Обновились товары с 21 по 40" и тд и тп. Но если я в скрипте укажу die('Обновились товары с...'), то он же перестанет выполняться. Можно ли это как-то реализовать в PHP?
  • Вопрос задан
  • 158 просмотров
Решения вопроса 2
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
скорее всего вам нужно что-то типа фетч прогресс, а в пхп сделать цикл c выводом данных, и заменить die на echo.
Ответ написан
zkrvndm
@zkrvndm
Архитектор решений
Все данные запрашивайте на php, если необходимо возвращать промежуточные результаты, то тупо возвращайте их при помощи echo (не забываем про разделитель для порций данных), на стороне браузера вы вполне можете читать ответ по частям по мере его получения, главное уложится в 60 секунд.

Если же загрузка может занять больше 60 секунд, то лучше использовать другую технологию:
Вариант 1) https://learn.javascript.ru/server-sent-events
Вариант 2) https://learn.javascript.ru/websocket
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы