Ajax-вызов отменяется браузером - PullRequest
6 голосов
/ 22 сентября 2011

Я использую инфраструктуру Prototype JS для выполнения вызовов Ajax. Вот мой код:

new Ajax.Request( '/myurl.php', {method: 'post', postBody: 'id='+id+'&v='+foo, onSuccess: success, onFailure: failed} );

function success(ret) {
console.log("success",ret.readyState, ret.status);
}
function failed(ret) {
console.log("failed",ret.readyState, ret.status);
}

В большинстве случаев это работает нормально, и функция успеха вызывается с кодом состояния 200. Примерно в 5% случаев в Safari функция успеха вызывается с кодом состояния 0. В этом случае, когда я Посмотрите на вкладке Сеть веб-инспектора, вызов ajax указан со статусом «отменено». С помощью журналов сервера я могу подтвердить, что запрос никогда не попадает на сервер. Это как если бы запрос ajax был немедленно отменен, даже не пытаясь соединиться с сервером. Я не нашел надежного способа воспроизвести это, кажется, случайным. Я делаю это 20 раз, и это происходит один раз.

Кто-нибудь знает, что может привести к отмене вызова ajax или возвращению кода состояния 0?

Ответы [ 2 ]

1 голос
/ 27 января 2012

Причина может быть комбинацией http-сервера и браузера, который вы используете.Это не похоже на ошибку библиотеки PrototypeJS.

В нескольких источниках указано, что параметр keep-alive HTTP-соединения нарушен в Safari (см. здесь , здесь или здесь ).На Apache они рекомендуют добавить это в конфигурацию:

BrowserMatch "Safari" nokeepalive

(пожалуйста, проверьте соответствующий синтаксис в документации к вашему серверу).

Если Safari плохо обрабатывает постоянные соединения HTTP с вашим сервером, онможет объяснить, что вы испытываете.

Если это не слишком сложно для вас, я бы попробовал другой HTTP-сервер, для каждой ОС доступно множество.

Нам не хватает информации, чтобы ответить полностьюваш ответ, хотяПроблема с сервером - ведущая, но могут быть и другие.Было бы неплохо узнать, делает ли это то же самое в других браузерах (Firefox с Firebug будет отображать такую ​​информацию, Chrome, Opera и IE имеют встроенные наборы инструментов разработки).Другой правильный вопрос - как часто вы выполняете этот AJAX-запрос в секунду (если уместно).

0 голосов
/ 05 сентября 2013

Я знаю, что это старая тема, но я хотел поделиться решением для Safari, которое могло бы сэкономить время другим. Следующая строка действительно решила все проблемы:

BrowserMatch "^(?=.*Safari)(?=.*Macintosh)(?!.*Chrom).*" nokeepalive gzip-only-text/html

Регулярное выражение гарантирует, что на Mac обнаружен только Safari, а не Mobile Safari, Chrome (ium) и тому подобное. Safari для Windows также не подходит, но проблема keepalive, похоже, заключается только в комбинации Mac-Safari. Кроме того, некоторые версии Safari плохо справляются с gzipped css / js.

Все наши симптомы сбоя нашего сайта или неполной загрузки CSS в разных версиях Safari, из-за которых я чуть не вырвал свои волосы (Safari - это новый IE), были решены для нас с помощью этого Apache «хака конфигурации».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...