Как долго браузер будет ждать после запроса ajax? - PullRequest
62 голосов
/ 04 сентября 2011

Как долго браузер может ждать, пока не появится сообщение об ошибке, прежде чем сервер ответит на запрос? Может ли это время быть неограниченным?

Ответы [ 4 ]

72 голосов
/ 04 октября 2011

Если вы используете вызов jQuery $ .ajax, вы можете установить свойство timeout, чтобы контролировать количество времени, по истечении которого запрос возвращается со статусом timeout. Время ожидания устанавливается в миллисекундах, поэтому просто установите его на очень высокое значение. Вы также можете установить его на 0 для «неограниченного», но, по моему мнению, вы должны просто установить высокое значение вместо этого.

Примечание: неограниченное число на самом деле является значением по умолчанию , но большинство браузеров имеют тайм-ауты по умолчанию, которые будут достигнуты.

Когда ajax-вызов возвращается из-за тайм-аута, он возвращается с ошибкой «timeout», которую вы можете обработать в отдельном случае, если это необходимо.

Так что, если вы хотите установить тайм-аут в 3 секунды и обработать тайм-аут, вот пример:

$.ajax({
    url: "/your_ajax_method/",
    type: "GET",
    dataType: "json",
    timeout: 3000, //Set your timeout value in milliseconds or 0 for unlimited
    success: function(response) { alert(response); },
    error: function(jqXHR, textStatus, errorThrown) {
        if(textStatus==="timeout") {  
            alert("Call has timed out"); //Handle the timeout
        } else {
            alert("Another error was returned"); //Handle other error type
        }
    }
});​
14 голосов
/ 03 октября 2011

Да и нет.Да, сервер может сделать это или быть настроен для этого, но в браузерах (я не знаю о специфике версии / дистрибьютора) тайм-ауты могут быть включены.

Существует 2 решения для достижения / эмуляции этого через HTTP:

  • Если это простой длительный скрипт, и вы ждете результатов, это не тот путь, вы должны вместо этого сделать, как упоминалось ранее, и использовать асинхронную обработку с опросом сервера для результатов,это было бы намного более надежным решением огня.Например: сценарий миниатюр со стороны сервера обработки изображений: пользователь загружает изображение, сервер немедленно возвращает 200 и «Идентификатор задания».Клиент (javascript ^^) может затем использовать JobID для запроса статуса / результата задания.
  • Если ваша цель - установить что-то вроде соединения в реальном времени между браузером и сервером (одностороннее соединение, после запросасделанный браузером, никакая дополнительная информация не может быть отправлена ​​без использования новых запросов (ajax ^^)), это называется длинным опросом / обратным ajax и может использоваться для связи в реальном времени через http.Есть несколько методов, использующих 2 длинных опрашиваемых запроса параллельно, так что после истечения одного из них тайм-аут второй становится активным, а первый пытается восстановить соединение.
3 голосов
/ 28 сентября 2011

Можете ли вы объяснить немного больше о том, чего вы пытаетесь достичь - у вас есть длительный процесс на сервере, вы хотите изменить настройки только на локальной машине или вы ищете способ управлять им? для большого количества пользователей?

Как долго браузер будет ждать, зависит от ряда факторов, например, где происходит таймаут - на уровне TCP, на сервере или в локальном браузере?

Если у вас есть долго работающий процесс на сервере, и вы хотите обновить веб-страницу впоследствии, типичным способом справиться с ней является асинхронный запуск длинного процесса и уведомление клиента о его завершении, например, иметь ajax-вызов, который опрашивает сервер, или использовать HTTP 1.1 и направлять поток уведомлений клиенту.

В любом случае соединение по-прежнему может быть закрыто, поэтому клиенту все равно потребуется возможность его повторного открытия.

2 голосов
/ 04 октября 2011

Я обнаружил, что в случае обычного запроса (HTML-страницы) браузеры запускаются по таймауту после cca. 30 секунд Это важно, потому что другие участники, вероятно, следуют этому: прокси, маршрутизаторы (играют ли маршрутизаторы в этой игре? Я не уверен). Я использую 4 с длительную задержку на стороне сервера (если нечего отправлять клиенту), и мой клиент AJAX немедленно выполняет еще один HTTP-запрос (я нахожусь в локальной сети, интернет-задержки нет). 4 секунды достаточно для того, чтобы не перегружать сервер и сеть частыми опросами, и достаточно коротки для случая, когда какой-либо опрос выпадает из строки, которую клиент не может обнаружить и обработать.

Кроме того, существуют другие проблемы с кометой (длинный HTTP-запрос): ограничение браузером количества одновременных HTTP-запросов, обработка событий на стороне клиента (должны быть отправлены на сервер немедленно), обнаружение и восстановление сервера / сети, многопользовательская обработка и т. д.

...