Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Ошибки отсутствия сзязи с сервером (https://javascript.ru/forum/misc/73497-oshibki-otsutstviya-szyazi-s-serverom.html)

Artur_Hopf 20.04.2018 09:56

Ошибки отсутствия сзязи с сервером
 
Добрый день. Страница сайта обновляется с помощью ajax запросов, когда связь с сервером прерывается(например на тех обслуживание) сыпятся такие ошибки:

GET 503 (Service Unavailable);
AJAX 503 (Service Unavailable);
GET net::ERR_CONNECTION_REFUSED;
AJAX net::ERR_CONNECTION_REFUSED;
AJAX 500 (Internal Server Error);

Например код выглядит так:
function update (){
      $.ajax({
            type: 'ajax',
            url: 'путь к файлу',
            dataType: 'json',
            success: function(data){
                    //работа с data
            },
            error: function(){
                console.log('error');
            }
      });
}
setInterval(function() {
        update ()
    }, 1000);


Как дописать в функции update() например :
function update (){
   if(есть связь с сервером){
       $.ajax({
            type: 'ajax',
            url: 'путь к файлу',
            dataType: 'json',
            success: function(data){
                   //работа с дата
            },
            error: function(){
                console.log('error');
            }
        });
   } else{
      console.log('Нет связи с сервером');
   }
}

Dilettante_Pro 20.04.2018 10:13

Artur_Hopf,
:-?
Вам что, стандартной обработки ошибок недостаточно?
error: function(xhr, status, error) {
        // handle error
    }

Artur_Hopf 20.04.2018 10:32

Dilettante_Pro,
И как мне написать? :-? :
error: function(xhr) {
        (xhr.status == 503) ? не выполнять запрос : выполнять запрос;
}

Artur_Hopf 20.04.2018 11:23

Dilettante_Pro,
Есть функция statusCode, если она вызвала 503 то как остановить дальнейшее выполнение опроса?
$.ajax({
        statusCode: {
                503: function(){
                }
            },
            type: 'ajax',
            url: 'путь к файлу',
            dataType: 'json',
            success: function(data){
                   //работа с дата
            }
        });

Dilettante_Pro 20.04.2018 11:30

Artur_Hopf,
Запрос не смог выполниться, прервался и вернул ошибку. Он уже остановлен.

Artur_Hopf 20.04.2018 11:49

Dilettante_Pro,
В целом понял спасибо. Просто если с сервером нет связи продолжительное время, то у клиента все виснет и не обновляется даже после появления связи с сервером. Наверное в сторону php копать.:-?

Dilettante_Pro 20.04.2018 11:49

Цитата:

Сообщение от Artur_Hopf
как остановить дальнейшее выполнение опроса

Вы имеете в виду, как прервать цикл setInterval? сделайте setInterval с именем и по нужному коду останавливайте его.
Кстати, ошибка 503 может возникать по той причине, что вы слишком часто посылаете запросы.

Dilettante_Pro 20.04.2018 11:55

Цитата:

Сообщение от Artur_Hopf
если с сервером нет связи продолжительное время, то у клиента все виснет

Это, наверное, по той причине, что сервер не отвечает, а setInterval посылает все новые и новые запросы.
Можно посылать новые запросы не по setInterval, а из разделов success или error - Тогда, пока запрос не остановился, новый не отправится.

Artur_Hopf 20.04.2018 11:56

Dilettante_Pro,
Нет, просто во время тех обслуживания сервера появляются проблемы, пытался решить остановом ajax запроса пока сервер недоступен. Вроде как setInterval не останавливать, а просто прекращать выполение ajax запроса, например вот так:
var stop;
function update (){
  if(stop)
      $.ajax({
            type: 'ajax',
            url: 'путь к файлу',
            dataType: 'json',
            success: function(data){
                    //работа с data
            },
            error: function(){
               stop = false;
            }
      });
}

Но если так прерывать ajax запрос, то при включении сервера ajax запрос не начнет работу. :-?
Должно быть просто решение, но не могу его найти.

Dilettante_Pro 20.04.2018 12:18

В вашем способе по ошибке stop = false; и никогда больше не становится true

У ajax есть параметр
Цитата:

timeout:integer
Время ожидания ответа от сервера. Задается в в миллисекундах. Если это время будет превышено, запрос будет завершен с ошибкой и произойдет событие error (см. описание выше), которое будет иметь статус "timeout".
Время отсчитывается с момента вызова функции $.ajax. Может случиться так, что в этот момент будет запущено несколько других запросов и браузер отложит выполнение текущего запроса. В этом случае timeout может завершиться, хотя фактически, запрос даже еще не был запущен.

Dilettante_Pro 20.04.2018 12:24

Если вам нужно, чтобы запросы шли один за другим
function update (){
      $.ajax({
            type: 'ajax',
            url: 'путь к файлу',
            timeout: 1000;
            dataType: 'json',
            success: function(data){
                    //работа с data
                   update();
            },
            error: function(){
               update();
            }
      });
}
update();

И никаких setInterval !!!
Если нужно, чтобы запросы шли с временным промежутком, можно update() в success и error запускать из setTimeout


Часовой пояс GMT +3, время: 01:29.