@GrimJack

Как будет правильнее цикл или вызов функции на саму себя?

Нужно итеративно обращаться к url который будет возвращать некоторые данные и на их основании делать новый почти такой же запрос.
Вопрос скорее чисто в оптимизации (чтоб браузеры не падали) пусть есть 300 итераций. значит нужно будет последовательно обратиться 300 раз к скрипту на сервере (аяксом). У меня есть 2 варианта:
1) циклом for пройтись (если запрос выполнен успешно - приступаем к следующей итерации). Этот метод прост, но очень "прожорлив" и браузер ложится при таком раскладе (запускаю не на калькуляторе)
2) сделать функцию с запросом внутри и если он выполнен успешно, то она вызывает саму себя и так пока не пройдет все итерации. Будет ли это выгодно?

Возможно есть более хитрый трюк?
  • Вопрос задан
  • 480 просмотров
Пригласить эксперта
Ответы на вопрос 4
Рекурсивная функция очень забивает стек, а циклы for очень оптимизированные по всех современных браузерах. Функция использовать нужно в том случае если вам это удобно или просто для практики.
Ответ написан
Комментировать
@sisn
Рекурсия не так забивает стек, как об этом написано в соседнем ответе.
Но проблема в том, что вы не можете это контролировать.
А 300 вызовов самой себя - это уже рисково.

Я бы положился на цикл, пусть даже будет сложнее запрограммировать.
Ответ написан
Комментировать
k12th
@k12th
console.log(`You're pulling my leg, right?`);
Если вызывать функцию из себя через setTimeout, то стек не забьется (setTimeout вызывает свой коллбек только когда стек пустой). Более того, это единственно разумный способ (ну еще можно setImmediate, но бывает нужна все-таки задержка), т.к. setInterval сдохнет при уходе вкладки в фон, а отправлять 300 запросов сразу -- сами видите, что получается.
Ответ написан
Комментировать
AlexXYZ
@AlexXYZ
O Keep Clear O
Коллеги! Где это видано, чтобы ajax-запросы и рекурсия с циклами были как-то связаны??? После отправки запроса javascript продолжает выполнение и ни о какой рекурсии или циклах не может идти речи! Константин Китманов написал про timeout, но с ajax такая же ситуация, только функция получает управление не по истечении интервала времени, а при получении данных. Никакой рекурсии! Можно смело гнать последовательно хоть 1000 запросов, главное не в параллель, т.к. все браузеры имеют ограничение на количество одновременных запросов - Chrome-6, IE-2. (Есть, конечно, способ обойти параллель на любое число запросов, но это костыль и может не всегда работать). Рабочий вариант только 2. Скрещивать for с ajax - гиблый номер.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы