ThreegunD
@ThreegunD

Правильный ajax-запрос для получения и объединение данных?

Суть такая:
По нажатию кнопки мы делаем запрос на сервер, получаем данные и проверяем, если длина данных равна 500, то отправляем ещё раз (указываем отступ в 500) и т.д. пока данных не будет меньше 500 (что значит, что больше нет).
В итоге получаем массив данных, например длиной 4500.
Пока остановился на синхронных запросах, т.к. в асинхронных-данные приходят раньше всех объединений.
Хотелось бы узнать, как сделать это правильно, чтобы не "замораживать" страницу на несколько секунд(как при синхронных запросах).
Пример того, как я это делаю сейчас.
function getMails () {
  var mails = [];
  var page = 1;
  function request () {
			  var result = false;
			  $.ajax(
			    url: 'какой-то урл/' + page,
			    async: false,
			    type: 'GET',
			    success: function (data) {
			      result = data.items;
			    }
			  });
			  return result;
			}
			function gluing () {
			  var part = request();
			    mails = mails.concat(part);
				if (part.length >= 500) {
					page++;
					gluing();
			  }
			}
gluing();
return mails;
}
  • Вопрос задан
  • 61 просмотр
Пригласить эксперта
Ответы на вопрос 1
Xuxicheta
@Xuxicheta
инженер
function getMails (done) {
   var mails = [];
  function request () {
        var result = false;
        $.ajax(
          url: 'какой-то урл/' + page,
          async: true,
          type: 'GET',
          success: function (data) {
            mails = mails.concat(data.items);
            if (data.items >= 500) {
                    request();
            } else {
                     done(mails);
            }
          }
        });
      }
}


Не проверял, но общая суть - в коллбэке успеха запроса проверяешь последний ли это был запрос, и если не последний - делаешь еще один.

Ну и return разумеется бесполезен теперь. Вместо него выполняем done

Минус в том что один из запросов может затупить и порядок будет нарушен. Неплохо бы сообщать запросам какой-нибудь офсет или порядковый номер, получать потом его и склеивать по порядку. Ну или отсортировать элементы нужным образом по айдишникам, например.
Ответ написан
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы
Интехнова Белгород
от 30 000 до 60 000 руб.
ИП Ким Хиун Москва
от 100 000 до 150 000 руб.
CAPYBARA digital Самара
от 40 000 до 50 000 руб.
14 авг. 2018, в 10:57
2400 руб./за проект
14 авг. 2018, в 10:44
3000 руб./за проект
14 авг. 2018, в 09:38
5000 руб./за проект