Не могу выпрыгнуть из ajax
Есть одна из функций с ajax. В цикле она отправляет запрос и получает разультат. Проблема в том,что в начале срабатывает сам цикл в 700+ раз (по уровню 1), а потом он падает в ajax (в уровень 2) и начинает там работать такое же кол-во раз. По нажатию кнопки я хочу остановить его. Буловская епременная меняется, но из ajax он не вылазит,что бы прервать цикл полностью. Т.е Я смотрю на 3-ем уровне и прерываю его. А вот к уровню 1 не могу вернуться,что бы полностью прервать его.
Подскажите как сделать. function HousesInCity(Streets, CityDate) { var list = document.getElementById('result'); $.each(Streets, function(i) { // Пусть это будет уровень один (1) // Выпадываем из цикла if (EACH_STATE_ACTIVE === false) { alert("Остановка"); return false; } params = { function : 'HouseForStreets', CityList: CityDate.id, country: CityDate.c_country, nameCity: CityDate.c_name, latitude: CityDate.c_latitude, longitude: CityDate.c_longitude, id_street: Streets[i].id, name_street: Streets[i].c_street_name }; try { // Пусть это будет уровень два (2) var zap = $.ajax({ type:'get', url:'yandex_houses_functions.php', action:'HouseForStreets', dataType:'json', data: params, success:function (result ) { // Пусть это будет уровень три (3) if (EACH_STATE_ACTIVE === false) { zap.abort(); return false; } if (result.status === false) { var newDiv = document.createElement('div'); newDiv.innerHTML = result.text+result.fail+result.dump; list.appendChild(newDiv); } } }); } catch(e) {alert("Ошибка вызова ajax запроса. Получение Домов для улицы ");} }); // Тут конец цикла } |
Попробуй использовать for вместо $.each.
|
Делайте ajax запросы последовательно. Сначала один, потом из success\error второй и.тд. пока элементы не кончатся либо вы н нажмёте на отмену. Поставив в очередь 700 запросов за раз - вы ничего с ними больше поделать не сможете.
|
Делал через for. Верхний цикл-то особо без разницы. Он в ниже крутится. Хотя по логике там он должен просто запрос сделать и всё. И опять на верх, к циклу
|
Цитата:
Ибо не совсем понял. Как в очередь кидать по одному запросу,а не сразу все 700 ? |
делаете массив для запроса, и делаете запрос удаля 1 элемент массива. На ответ смотрите пустой ли массив и если не пустой то делаете ещё 1 запрос и так пока не кончится (называется рекурсия)
|
Цитата:
function HousesInCisy(AllStreet) { var list = document.getElementById('result'); if (EACH_STATE_ACTIVE === false || AllStreet.lenght===0) { // Готово или Остановили. var newDiv = document.createElement('div'); newDiv.innerHTML = "Готово или остановленно"; list.appendChild(newDiv); return; } else { params = { function : 'HouseForStreets', CityList: CityData.id, country: CityData.c_country, nameCity: CityData.c_name, latitude: CityData.c_latitude, longitude: CityData.c_longitude, id_street: AllStreet[0].id, name_street: AllStreet[0].c_street_name }; $.ajax({ type:'get', url:'yandex_houses_functions.php', action:'HouseForStreets', dataType:'json', data: params, success:function (result ) { if (result.status === false) { var newDiv = document.createElement('div'); newDiv.innerHTML = result.text+result.fail+result.dump; list.appendChild(newDiv); } } }); AllStreet.shift(); HousesInCisy(AllStreet); } } |
Много текста, неохота разбиратся. Делайте тестовые примеры отображающие суть. Например то что я хотел сказать:
var toRequest = [{...}, {...}, {...}, {...}]; var check = function () { if (toRequest.length) { load(toRequest.pop()); } else { //Все запросы выполнены и ответы получены! } }; var load = function (params) { $.ajax({ data: params, success: function (data) { //Обрабатываем ответ check();//Если по логике дальнейшие запросы не нужны не вызываем } }); } check(); |
Сделал так, как вы привели в примере. В итоге он всё равно в начале готовит очередь и ничего не показывает. А потом резко начинает её выдавать и уже не остановится. Если смотреть в консоле-то он всё подгатавливает в начале, а потом только выполняет запросы и показывает на странице. А так пользователь не знает в какой момент сделать остановку, ибо на странице ничего нет по началу. А когда появляется-то очередь уже готова и будет отрабатывать до конца.
О. А точнее она просто теперь не прерывается, и значение bool переменнй не меняется, даже стр не обновляется пока цикл не закончится Но спасибо за помощь. function HousesInCisy() { var list = document.getElementById('result'); if (EACH_STATE_ACTIVE === false || !Streets.length) { console.log(Streets); var newDiv = document.createElement('div'); newDiv.innerHTML = "Готово или остановленно"; list.appendChild(newDiv); return; } else { Zapros(Streets.shift(),list); } } function Zapros(AllStreet,list) { console.log(AllStreet); params = { function : 'HouseForStreets', CityList: CityData.id, country: CityData.c_country, nameCity: CityData.c_name, latitude: CityData.c_latitude, longitude: CityData.c_longitude, id_street: AllStreet.id, name_street: AllStreet.c_street_name }; $.ajax({ type:'get', url:'yandex_houses_functions.php', action:'HouseForStreets', dataType:'json', data: params, success:function (result ) { if (result.status === false) { var newDiv = document.createElement('div'); newDiv.innerHTML = result.text+result.fail+result.dump; list.appendChild(newDiv); } } }); HousesInCisy(); } |
Rommik,
У меня вызов функции check стоит внутри success, а у вас HousesInCisy находится вне success |
Часовой пояс GMT +3, время: 14:28. |