Вход

Просмотр полной версии : остановка ajax-запроса по действию пользователя


mi.rafaylik
11.02.2013, 23:55
Всем привет ))
Читал мануалы, и пытался сначала разобраться по ним, но увы, баран я баран.
Задача - после отправки ajax-запроса, остановить его (оборвать) по действию пользователя (событие click()), независимо от таймаута самого запроса. Юзаю jQuery, и что-то делаю неправильно, потому что chatExit.abort(); не обрывает запрос :/
Приведу выдержки из кода, которые касаются моего вопроса, опуская пользовательские функции:
$(document).ready(function(){

// функция отправки запроса на наличие новых сообщений
function chatConnect(){
// даём имя переменной, чтоб потом сделать для неё chatExit.abort()
var chatExit = $.ajax({
type: 'POST',
url: 'process.php',
data: 'lastmsg='+lastmsg, // передаём данные последнего полученного сообщения
dataType: 'json',
cache: false,
timeout: 180000, // при отсутствии ответа с сервера
success: function(){
$('.chat-posts').html('...'); // здесь выводим полученные данные
// выполняем новый запрос при успешном выполнении
chatConnect();
},
error: function(){
// выполняем новый запрос по окончанию timeout
chatConnect();
}
});
};

// вызываем функцию при входе в чат
$('.chat-enter').click(function(){
chatConnect();
});

// обрываем текущий запрос при выходе из чата
$('.chat-exit').click(function(){
chatExit.abort();
});

});

Есть догадка что abort() не видит переменную chatExit так как она находится внутри другой функции. Может это быть причиной?

danik.js
12.02.2013, 00:06
Может это быть причиной
Именно это и есть причина. Объявите эту переменную немного выше, в области видимости обеих функций.

mi.rafaylik
12.02.2013, 00:11
danik.js, теперь порядок, спасибо )

mi.rafaylik
12.02.2013, 08:37
Попутно возникла следующая ситуация:
Я выполняю abort() для переменной chatExit, а в самой переменной (точнее в ajax-запросе) при этом наступает событие error, при котором отправляется повторный запрос.

Решил проблему так:
При выходе из чата скрываю блок с сообщениями (chat-posts) и отображаю блок логина.
В событии error (которое в ajax-запросе) пишу функцию (которую выношу из запроса). В функции пишу условие - если блок chat-posts видим (is:visible) тогда выполняется отправка повторного ajax-запроса. Если же chat-posts невидим (вышли из чата), ничего не происходит ))

danik.js
12.02.2013, 10:14
Странно что abort() вызывает error. Однако думаю в обработчике error можно определить причину возникновения ошибки (по статус-коду или еще как). И в случае аборта - просто игнорировать ее.