Совсем недавно столкнулся с серьезной проблемой: я разрабатывал приложение для ВКонтакте и мне нужно было отправить несколько одинаковых запросов на сервер ВК, потом обработать полученные данные. Сначала я не увидел в этом ни каких проблем: написать запрос и засунуть его в цикл. Но не тут-то было. Я не учел того, что js невозможно остановить(и он не ждет ответа ajax), получилось так, что пока первый запрос еще даже не получил ответ, цикл уже отработал и сделал кучу запросов. Возможно в другой ситуации я не обратил на это внимание, но в приложениях ВК так делать нельзя.
Поскольку есть ряд подводных камней, самые явные это то, что нельзя отправлять к серверу ВК больше 3х запросов в секунду, и то, что нужно дождаться ответа сервера, получить данные, в некоторых случаях спросить что-то у пользователя, а уже потом делать второй запрос. В связи с этими «заморочками» пришлось ломать голову, как остановить js код. Самый оптимальный вариант, который я придумал, это использования рекурсии. Для тех кто не знает, что это такое рекурсия: простыми словами — это когда функция вызывает сама к себя.
В этой статье я не буду приводить рабочий исходник, а просто сделаю набросок:
function testfunc($par){ // делаем ajax запрос, и в случае успешного или неудачного запроса // делаем какие-то операции, после их выполнения // можно сделать счетчик для рекурсии $par ++; // и при выполнения некоторых условий либо вызываем testfunc($par); if ($par<10){ testfunc($par); } // либо выходим из рекурсии }