13.08.2014, 11:55
|
Новичок на форуме
|
|
Регистрация: 13.08.2014
Сообщений: 6
|
|
Не могу выпрыгнуть из 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 запроса. Получение Домов для улицы ");}
}); // Тут конец цикла
}
|
|
13.08.2014, 12:12
|
|
Профессор
|
|
Регистрация: 19.01.2010
Сообщений: 354
|
|
Попробуй использовать for вместо $.each.
|
|
13.08.2014, 12:14
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,587
|
|
Делайте ajax запросы последовательно. Сначала один, потом из success\error второй и.тд. пока элементы не кончатся либо вы н нажмёте на отмену. Поставив в очередь 700 запросов за раз - вы ничего с ними больше поделать не сможете.
__________________
29375, 35
|
|
13.08.2014, 12:43
|
Новичок на форуме
|
|
Регистрация: 13.08.2014
Сообщений: 6
|
|
Делал через for. Верхний цикл-то особо без разницы. Он в ниже крутится. Хотя по логике там он должен просто запрос сделать и всё. И опять на верх, к циклу
|
|
13.08.2014, 12:46
|
Новичок на форуме
|
|
Регистрация: 13.08.2014
Сообщений: 6
|
|
Сообщение от Aetae
|
Делайте ajax запросы последовательно. Сначала один, потом из success\error второй и.тд. пока элементы не кончатся либо вы н нажмёте на отмену. Поставив в очередь 700 запросов за раз - вы ничего с ними больше поделать не сможете.
|
Можно пример?
Ибо не совсем понял. Как в очередь кидать по одному запросу,а не сразу все 700 ?
|
|
13.08.2014, 13:18
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
делаете массив для запроса, и делаете запрос удаля 1 элемент массива. На ответ смотрите пустой ли массив и если не пустой то делаете ещё 1 запрос и так пока не кончится (называется рекурсия)
|
|
13.08.2014, 15:52
|
Новичок на форуме
|
|
Регистрация: 13.08.2014
Сообщений: 6
|
|
Сообщение от tsigel
|
делаете массив для запроса, и делаете запрос удаля 1 элемент массива. На ответ смотрите пустой ли массив и если не пустой то делаете ещё 1 запрос и так пока не кончится (называется рекурсия)
|
Он всё равно условие else всегда выполняет и продолжает херачить...
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);
}
}
Последний раз редактировалось Rommik, 14.08.2014 в 11:42.
Причина: Изменение кода
|
|
13.08.2014, 17:03
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
Много текста, неохота разбиратся. Делайте тестовые примеры отображающие суть. Например то что я хотел сказать:
var toRequest = [{...}, {...}, {...}, {...}];
var check = function () {
if (toRequest.length) {
load(toRequest.pop());
} else {
//Все запросы выполнены и ответы получены!
}
};
var load = function (params) {
$.ajax({
data: params,
success: function (data) {
//Обрабатываем ответ
check();//Если по логике дальнейшие запросы не нужны не вызываем
}
});
}
check();
|
|
14.08.2014, 12:02
|
Новичок на форуме
|
|
Регистрация: 13.08.2014
Сообщений: 6
|
|
Сделал так, как вы привели в примере. В итоге он всё равно в начале готовит очередь и ничего не показывает. А потом резко начинает её выдавать и уже не остановится. Если смотреть в консоле-то он всё подгатавливает в начале, а потом только выполняет запросы и показывает на странице. А так пользователь не знает в какой момент сделать остановку, ибо на странице ничего нет по началу. А когда появляется-то очередь уже готова и будет отрабатывать до конца.
О. А точнее она просто теперь не прерывается, и значение 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, 14.08.2014 в 12:12.
|
|
14.08.2014, 12:06
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
Rommik,
У меня вызов функции check стоит внутри success, а у вас HousesInCisy находится вне success
|
|
|
|