http://blagtalkan.ru
http://oktpoisk.ru
http://mysorru.ru/
http://san-okt.ru/
http://pes6evolution.ru/
http://chasikigov.ru
http://serafimsovet.ru
http://filmsgov.ru
http://free-domen.ru
http://fithonda.ru/forums/index.php
http://avtogov.ru
http://www.1001bilet.com.ua/base/on-line/
http://pravilavoini.ru
http://school41ufa.ru
http://rusrav4.ru
Отмена запросов | Книга AJAX
 

Кета на стороне сервера произойдет какая-либо ошибка (возвращае¬мый статус HTTP не будет равен 200), то придется решать, что с этим вг.тять. Если статус HTTP говорит о том, что файл не найден (404) или возникла внутренняя ошибка сервера (302), повторные попытки полу¬чить необходимые сведения через несколько минут едва ли помогут ликвидировать проблему, поскольку обе эти ошибки требуют вмеша¬тельства администратора. Простейший способ выйти из этой ситуации с наименьшими потерями состоит в том, чтобы отменить все запросы, ожидающие обработки. Можно предусмотреть в сценарии флаг, кото¬рый будет говорить: «больше не посылать запросы». Это достаточно ростое и эффективное решение при использовании шаблона периоди¬ческого обновления содержимого страницы.
Для учета подобных ситуаций можно изменить пример с уведомлени¬ем о получении новых сообщений. В данном случае решение на базе Ajax предоставляет пользователю дополнительную информацию, но не является основной целью страницы. Если запрос терпит неудачу, никаких причин специально оповещать об этом пользователя-вточно не выполнять запросы в будущем, чтобы избежать повтор-появления ошибок. Для этого необходимо добавить глобальную переменную, по содержимому которой можно будет определить, раз¬решена ли посылка запросов:
Перед выполнением каждого запроса необходимо проверять значение переменной blnRequestsEnabled. Для этого достаточно «завернуть» тело функции checkComments() в условный оператор if:
•jnction checkCommentsO {
<
if (blnRequestsEnabled), if (!oXmlHttp) {
oXmlHtto = zXmiHttp.createRequest(); } else if (oXmlHttp.readyState != 0) { oXmlHttp.abort();
>
oXmlHttp.open("get", "CheckComments.php", true); oXmlHttp.onreadystatechange = function () { if (oXmlHttp.readyState == 4) { if (oXmlHttp.status == 200) {
var aData = oXmlHttp.responseText.split("|| if (aData[0] != iLastCommentld) { if (iLastCommentld != -1) {
Но это еще не все; кроме этого необходимо определить тип ошибки: бо это ошибка сервера, в результате которой вы получаете код ста HTTP, либо это обрыв связи с сервером (или сервер остановлен, потеряно соединение с Интернетом).
Для начала обернем все, что находится в пределах самого верхн оператора if, в конструкцию try.. .catch. Время реакции разных б; узеров на обрыв связи различно, но все они возбуждают исключит ную ситуацию. Обертывание всего блока кода, выполняющего зап в конструкцию try.. .catch обеспечит перехват исключения, в о на которое можно записать в переменную blnRequestEnabled значе false. Что касается ошибок сервера, вы можете сами возбуждать ключение при получении статуса HTTP, отличного от 200. Эти ис чения также будут перехватываться блоком try... catch и будут ок вать тот же эффект, что и исключения, вызванные разрывом соед ния (запись значения false в переменную blnRequestEnabled):
function checkCommentsO { if (blnRequestsEnabled) {
try { ., ' , •
if (!oXmlHttp) {
oXmlHttp = zXmlHttp.createRequest(); } else if (oXmlHttp.readyState != 0) {
oXmlHttp.abortО;
}
oXmlHttp.open("get", "CheckComments.php", true); oXmlHttp.onreadystatechange = function () {
if (oXmlHttp.readyState == 4) { if (oXmlHttp.status == 200) {
var aData = oXmlHttp.responseText.split("||"); if (aData[0] != iLastCommentld) { if (iLastCommentld != -1) {
showNotification(aData[1], aData[2]);
}
iLastCommentld = aData[0];
}
setTimeout(checkComments, ilnterval); } else {
throw new Error("Возникла ошибка! •"-);.

}
};
oXmlHttp.send(null); } catch (oException) {
blnRequestsEnabled = false;
Если теперь возникнет одна из двух ошибочных ситуаций, будет воз-§уждено исключение (либо броузером, либо программой) и в перемен¬ную blnRequestEnabled будет записано значение false, что предотвратит посылку следующих запросов при повторных обращениях к функции
ineckCommentsO.
Вероятно, вы уже заметили, что тайм-аут для запуска последующих за¬просов назначается, только если получен код состоянии HTTP 200; это препятствует запуску повторных запросов при получении любых других кодов состояния HTTP. Такое решение прекрасно подходит для обработки ошибочных ситуаций, возникающих на стороне сервера, но оно малопри¬годно для случая утери соединения с Интернетом. Надо предусматри¬вать различные способы обработки разнотипных ошибок.