Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.09.2014, 17:25
Профессор
Отправить личное сообщение для Dimaz Посмотреть профиль Найти все сообщения от Dimaz
 
Регистрация: 25.12.2009
Сообщений: 222

Как остановить все активные ajax-запросы?
После создания каждого нового запроса, объект XHR сохраняется в массив. Затем я пытаюсь остановить все активные запросы с помощью функции:
btn.addEventListener('click',function(){
var len = arr_xhr.length;
for(var i = 0; i<len; i++){
if(arr_xhr[i].status != 200) return;
arr_xhr[i].abort();
}
});

Проблема в том, что функция срабатывает только один раз. Т.е., если потом добавить еще несколько загрузок, функция отказывается их останавливать.
Ответить с цитированием
  #2 (permalink)  
Старый 24.09.2014, 17:55
Новичок на форуме
Отправить личное сообщение для iReal Посмотреть профиль Найти все сообщения от iReal
 
Регистрация: 24.09.2014
Сообщений: 5

Попробуйте
if(arr_xhr[i].status != 200) arr_xhr[i].abort();
Ответить с цитированием
  #3 (permalink)  
Старый 24.09.2014, 18:27
Профессор
Отправить личное сообщение для Dimaz Посмотреть профиль Найти все сообщения от Dimaz
 
Регистрация: 25.12.2009
Сообщений: 222

Сообщение от iReal Посмотреть сообщение
Попробуйте
if(arr_xhr[i].status != 200) arr_xhr[i].abort();
И что это такое? Вы мне предлагаете останавливать запрос, если он уже закончен. Я оператор return и добавил с той целью, чтобы начать новую итерацию.
Ответить с цитированием
  #4 (permalink)  
Старый 24.09.2014, 18:39
Новичок на форуме
Отправить личное сообщение для iReal Посмотреть профиль Найти все сообщения от iReal
 
Регистрация: 24.09.2014
Сообщений: 5

Сообщение от Dimaz Посмотреть сообщение
И что это такое? Вы мне предлагаете останавливать запрос, если он уже закончен. Я оператор return и добавил с той целью, чтобы начать новую итерацию.
1) 200 - код успешного HTTP запроса.
2) return не завершает итерацию цикла, это делает continue.

Если Вы хотите избежать вызова abort на всех запросах, что уже завершены (т.е. их код == 200), Вы напишете:
if(arr_xhr[i].status == 200) continue;
arr_xhr[i].abort();

Что эквивалентно:
if(arr_xhr[i].status != 200) arr_xhr[i].abort();

Последний раз редактировалось iReal, 24.09.2014 в 18:44.
Ответить с цитированием
  #5 (permalink)  
Старый 24.09.2014, 19:15
Профессор
Отправить личное сообщение для Dimaz Посмотреть профиль Найти все сообщения от Dimaz
 
Регистрация: 25.12.2009
Сообщений: 222

iReal,
Что вы меня путаете? Вставьте console.log после оператора return И убедитесь, что начнется новая итерация, а код после return не выполнится.
Цитата:
Что эквивалентно:
if(arr_xhr[i].status != 200) arr_xhr[i].abort();
А это что? Вы опять вызываете abort, если загрузка и так уже завершена.
Ответить с цитированием
  #6 (permalink)  
Старый 24.09.2014, 19:37
Профессор
Отправить личное сообщение для Dimaz Посмотреть профиль Найти все сообщения от Dimaz
 
Регистрация: 25.12.2009
Сообщений: 222

if(arr_xhr[i].status = 200) arr_xhr[i].abort();

Вот этот код работает. Вопрос закрыт. На счет return вы были правы. Прошу прощения, исправлюсь)

Последний раз редактировалось Dimaz, 24.09.2014 в 19:39.
Ответить с цитированием
  #7 (permalink)  
Старый 24.09.2014, 19:48
Новичок на форуме
Отправить личное сообщение для iReal Посмотреть профиль Найти все сообщения от iReal
 
Регистрация: 24.09.2014
Сообщений: 5

Сообщение от Dimaz Посмотреть сообщение
if(arr_xhr[i].status = 200) arr_xhr[i].abort();

Вот этот код работает. Вопрос закрыт. На счет return вы были правы. Прошу прощения, исправлюсь)
Вы как-то коряво условие в if записали, что оно всегда true.
Можете просто написать:
arr_xhr[i].abort();
Ответить с цитированием
  #8 (permalink)  
Старый 24.09.2014, 20:14
Профессор
Отправить личное сообщение для Dimaz Посмотреть профиль Найти все сообщения от Dimaz
 
Регистрация: 25.12.2009
Сообщений: 222

iReal,
Цитата:
Можете просто написать:
arr_xhr[i].abort();
Так в этом случае он все запросы без разбора будет останавливать, даже завершенные.
Если выводить в консоль статус во время загрузки файла, то он будет равен 200. А если остановить загрузку, тогда статус будет равен 0.
console.log(xrh.status);
Ответить с цитированием
  #9 (permalink)  
Старый 24.09.2014, 20:30
Профессор
Отправить личное сообщение для Dimaz Посмотреть профиль Найти все сообщения от Dimaz
 
Регистрация: 25.12.2009
Сообщений: 222

Всё, я разобрался. Статус становится равен "0", только если загрузку остановить вручную, а если файл загрузится, тогда статус будет равен всё равно 200. Поэтому лучше проверять не статус, а состояние. У всех XHR состояние будет равно "4" не зависимо от того, была остановлена загрузка вручную, либо файл был полностью загружен.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать все содержимое страницы не активным son313 jQuery 9 10.07.2013 16:58
Как можно кешировать Ajax запрос ? saturn AJAX и COMET 5 27.10.2012 14:48
Как ускорить вставку html из ajax? jey7 AJAX и COMET 7 27.05.2012 11:02
form, onclick, function...как это все сплести воедино? Berowz Общие вопросы Javascript 0 04.03.2012 15:06
глюк форума Gvozd Сайт Javascript.ru 11 18.03.2009 14:37