$.пример тайм-аута ajax неправильный и опасный?

#javascript #jquery #ajax

#javascript #jquery #ajax

Вопрос:

При поиске «длительного опроса с использованием jquery» эта ссылка является лучшим результатом, и я удивлен, почему люди не захотели узнать, были ли они правы в том, что они сказали.

Они говорят:

Тайм-аут: установите тайм-аут (в миллисекундах) для запроса. Период тайм-аута начинается с момента выполнения вызова $.ajax. Здесь мы устанавливаем тайм-аут на 30 секунд. Это означает, что наша функция опроса не будет вызываться снова, пока оба вызова ajax не будут завершены и (по крайней мере) не пройдет тридцать (30)
секунд.

(курсив мой)

Но, я полагаю, это не так.

Я протестировал этот код:

 (function foo(){
    $.ajax({
        url:'/echo/json',
        success:function(d){
          console.log('Logged after 30secs');
        },
        timeout:30000,
        complete: foo
    });
})();
 

и вот скрипка, чтобы доказать, что выделенный текст неправильный.

Вы можете видеть, что console.log() это вызывается до 30 секунд.

Оба метода setTimeout и setInterval имеют один и тот же недостаток — при каждом вызове метода необходимо открывать новое соединение с сервером $.ajax . Чтобы установить это соединение, ваше приложение реального времени должно быть настроено и пробиваться через скопления конкурирующего сетевого трафика, чтобы добраться до вашего сервера.

Есть ли какое-либо надежное решение (кроме сокетов), чтобы сделать длительный опрос безупречным?

Комментарии:

1. Я почти уверен, что они ошибаются. Тайм-аут, насколько я понимаю, определяет максимальное количество времени, которое xmlhttprequest потратит на попытку получить информацию с сервера.

2. «Установите тайм-аут (в миллисекундах) для запроса. Это переопределит любой глобальный тайм-аут, установленный с помощью $.ajaxSetup() . Период тайм-аута начинается с момента выполнения вызова $.ajax» — jQuery docs, api.jquery.com/jquery.ajax

3. Не могли бы вы уточнить, что такое «это» в вашем вопросе «сделать это безупречным»? Тайм-аут действительно указывает максимальное время, а не минимальное, но это ясно из документации. Если вам нужно гарантировать некоторое время между вызовами, просто подождите после завершения вызова, если это необходимо…

4. @AlexeiLevenkov отредактировано, чтобы быть более понятным

5. Я все еще не уверен, что вы ищете — если ваш случай требует определенного поведения — реализуйте его (т. Е. Иногда вам просто нужно ответить, как только он станет доступен). Реализация long-poll по умолчанию заключается в том, чтобы ставить запрос в очередь сразу после завершения предыдущего, чтобы вы всегда получали данные с сервера, как только они будут доступны. Обратите внимание, что если сервер немедленно отвечает на запрос, вам нужно будет ждать между вызовами, но я бы не назвал это длительным опросом.

Ответ №1:

Подождите, параметр тайм-аута в ajax-методе jQuery не имеет ничего общего с длительным опросом. Статья о длительном опросе верна. Он использовал setTimeout при закрытии. Поскольку следующее выполнение функции выполняется внутри самой функции, это гарантирует, что функция вызывается по очереди.

Однако параметр тайм-аута jQuery $.ajax позволяет указать время, по истечении которого вызов отменяется. т.Е., Если серверу требуется слишком много времени для ответа, просто отмените запрос. Это не имеет ничего общего с «длительным опросом».

Блок кода должен быть:

 (function foo(){
    setTimeout(function(){
       $.ajax({
          url:'/echo/json',
          success:function(d){
            console.log('Logged after 30secs');
            foo()
          }
       });
    }, 30000);


})();
 

Ответ №2:

Я установил этот код:

 (function foo(){
    $.ajax({
        url:'/echo/json',
        success:function(d){
          console.log('Logged after 30secs');
        },
        timeout:30000,
        complete: foo
    });
})();
 

они говорят: функция опроса не будет вызываться снова, пока оба вызова ajax не будут завершены и (по крайней мере) не пройдет тридцать (30) секунд.

Это действительно очень неправильно. Это должно быть: «функция опроса будет вызвана, как только вызов ajax будет завершен или (самое большее) пройдет тридцать (30) секунд» для вашего кода.

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

 (function poll() {
   setTimeout(function() {
       $.ajax({ url: "server", success: function(data) {
            sales.setValue(data.value);
       }, dataType: "json", complete: poll });
    }, 30000);
})();
 

Здесь poll функция будет вызвана снова, как только пройдет тридцать секунд, а затем вызов ajax будет завершен.

Оба метода setTimeout и setInterval имеют один и тот же недостаток — при каждом вызове метода необходимо открывать новое соединение с сервером $.ajax . Чтобы установить это соединение, ваше приложение реального времени должно быть настроено и пробиваться через скопления конкурирующего сетевого трафика, чтобы добраться до вашего сервера.

Есть ли какое-либо надежное решение (кроме сокетов), чтобы сделать длительный опрос безупречным?

Ну, открытие нового соединения лежит в природе метода. Вы действительно не можете предотвратить это (но обратите внимание, что сеть может оптимизировать это). Однако, имхо, основное внимание в статье уделялось недостатку, заключающемуся в том, что у вас будет огромное количество запросов, если сервер немедленно ответит на них («постоянный» опрос). Вы можете устранить этот недостаток, используя длительный опрос (изменяя способ обработки запросов опроса сервером):

Длительный опрос устраняет недостатки традиционного опроса, сохраняя соединение с вашим сервером открытым. Сохранение соединения с сервером открытым устраняет время перехода от клиента к серверу и, таким образом, значительно уменьшает проблемы, связанные с задержкой в сети.