Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.08.2014, 11:55
Новичок на форуме
Отправить личное сообщение для Rommik Посмотреть профиль Найти все сообщения от Rommik
 
Регистрация: 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 запроса. Получение Домов для улицы ");} 

      
           });   // Тут конец цикла
           
       }
Ответить с цитированием
  #2 (permalink)  
Старый 13.08.2014, 12:12
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

Попробуй использовать for вместо $.each.
Ответить с цитированием
  #3 (permalink)  
Старый 13.08.2014, 12:14
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

Делайте ajax запросы последовательно. Сначала один, потом из success\error второй и.тд. пока элементы не кончатся либо вы н нажмёте на отмену. Поставив в очередь 700 запросов за раз - вы ничего с ними больше поделать не сможете.
__________________
29375, 35
Ответить с цитированием
  #4 (permalink)  
Старый 13.08.2014, 12:43
Новичок на форуме
Отправить личное сообщение для Rommik Посмотреть профиль Найти все сообщения от Rommik
 
Регистрация: 13.08.2014
Сообщений: 6

Делал через for. Верхний цикл-то особо без разницы. Он в ниже крутится. Хотя по логике там он должен просто запрос сделать и всё. И опять на верх, к циклу
Ответить с цитированием
  #5 (permalink)  
Старый 13.08.2014, 12:46
Новичок на форуме
Отправить личное сообщение для Rommik Посмотреть профиль Найти все сообщения от Rommik
 
Регистрация: 13.08.2014
Сообщений: 6

Сообщение от Aetae Посмотреть сообщение
Делайте ajax запросы последовательно. Сначала один, потом из success\error второй и.тд. пока элементы не кончатся либо вы н нажмёте на отмену. Поставив в очередь 700 запросов за раз - вы ничего с ними больше поделать не сможете.
Можно пример?
Ибо не совсем понял. Как в очередь кидать по одному запросу,а не сразу все 700 ?
Ответить с цитированием
  #6 (permalink)  
Старый 13.08.2014, 13:18
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

делаете массив для запроса, и делаете запрос удаля 1 элемент массива. На ответ смотрите пустой ли массив и если не пустой то делаете ещё 1 запрос и так пока не кончится (называется рекурсия)
Ответить с цитированием
  #7 (permalink)  
Старый 13.08.2014, 15:52
Новичок на форуме
Отправить личное сообщение для Rommik Посмотреть профиль Найти все сообщения от Rommik
 
Регистрация: 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. Причина: Изменение кода
Ответить с цитированием
  #8 (permalink)  
Старый 13.08.2014, 17:03
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 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();
Ответить с цитированием
  #9 (permalink)  
Старый 14.08.2014, 12:02
Новичок на форуме
Отправить личное сообщение для Rommik Посмотреть профиль Найти все сообщения от Rommik
 
Регистрация: 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.
Ответить с цитированием
  #10 (permalink)  
Старый 14.08.2014, 12:06
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AJAX навигация без якоря(Требуется помощ) Radik55rus AJAX и COMET 11 14.08.2014 10:34
Не могу разобраться с jquery ajax pro_xaoc jQuery 3 20.08.2012 19:20
Не могу сделать ajax запрос jazzz13 AJAX и COMET 4 17.05.2012 16:31
SOS! Не могу перевыбрать после ajax dopelher jQuery 1 05.04.2011 14:39
Textarea после ajax не могу обратится mikeles Общие вопросы Javascript 0 12.01.2011 23:02