Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Не могу выпрыгнуть из ajax (https://javascript.ru/forum/jquery/49437-ne-mogu-vyprygnut-iz-ajax.html)

Rommik 13.08.2014 11:55

Не могу выпрыгнуть из 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 запроса. Получение Домов для улицы ");} 

      
           });   // Тут конец цикла
           
       }

ixth 13.08.2014 12:12

Попробуй использовать for вместо $.each.

Aetae 13.08.2014 12:14

Делайте ajax запросы последовательно. Сначала один, потом из success\error второй и.тд. пока элементы не кончатся либо вы н нажмёте на отмену. Поставив в очередь 700 запросов за раз - вы ничего с ними больше поделать не сможете.

Rommik 13.08.2014 12:43

Делал через for. Верхний цикл-то особо без разницы. Он в ниже крутится. Хотя по логике там он должен просто запрос сделать и всё. И опять на верх, к циклу

Rommik 13.08.2014 12:46

Цитата:

Сообщение от Aetae (Сообщение 325621)
Делайте ajax запросы последовательно. Сначала один, потом из success\error второй и.тд. пока элементы не кончатся либо вы н нажмёте на отмену. Поставив в очередь 700 запросов за раз - вы ничего с ними больше поделать не сможете.

Можно пример?
Ибо не совсем понял. Как в очередь кидать по одному запросу,а не сразу все 700 ?

tsigel 13.08.2014 13:18

делаете массив для запроса, и делаете запрос удаля 1 элемент массива. На ответ смотрите пустой ли массив и если не пустой то делаете ещё 1 запрос и так пока не кончится (называется рекурсия)

Rommik 13.08.2014 15:52

Цитата:

Сообщение от tsigel (Сообщение 325637)
делаете массив для запроса, и делаете запрос удаля 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);
             }
    }

tsigel 13.08.2014 17:03

Много текста, неохота разбиратся. Делайте тестовые примеры отображающие суть. Например то что я хотел сказать:

var toRequest = [{...}, {...}, {...}, {...}];

var check = function () {

   if (toRequest.length) {
      load(toRequest.pop());
   } else {
      //Все запросы выполнены и ответы получены!
   }

};

var load = function (params) {
 
   $.ajax({
      data: params,
      success: function (data) {
         //Обрабатываем ответ
         check();//Если по логике дальнейшие запросы не нужны не вызываем
      }
   });

}

check();

Rommik 14.08.2014 12:02

Сделал так, как вы привели в примере. В итоге он всё равно в начале готовит очередь и ничего не показывает. А потом резко начинает её выдавать и уже не остановится. Если смотреть в консоле-то он всё подгатавливает в начале, а потом только выполняет запросы и показывает на странице. А так пользователь не знает в какой момент сделать остановку, ибо на странице ничего нет по началу. А когда появляется-то очередь уже готова и будет отрабатывать до конца.

О. А точнее она просто теперь не прерывается, и значение 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();
    }

tsigel 14.08.2014 12:06

Rommik,
У меня вызов функции check стоит внутри success, а у вас HousesInCisy находится вне success


Часовой пояс GMT +3, время: 14:28.