Как обнаружить отказ Ajax-вызова из-за отключения сети

Я отправляю много данных, используя метод jquery ajax для веб-сервера и клиентской стороны, отвечающий только после получения подтверждения от сервера, теперь предположим, что сетевое соединение потеряно в MIDDLE вызова ajax, а затем, как обнаружить эту ситуацию.

$.ajax({
         url:'server.php',
         data:'lots of data from 200KB to 5MB',
         type:'post',
         success: function(data)
                    {
                        alert('Success');
                      //some stuff on success

                    },
          error: function(XMLHttpRequest, textStatus, errorThrown)
                    {
                        alert('Failure');
                      //some stuff on failure
                    }
        });

Это мой код, и он не дает ошибку в середине вызова ajax, если отключен интернет.

ПРИМЕЧАНИЕ. Я не могу использовать тайм-аут, потому что размер данных варьируется от 200 кб до 5 МБ, а расчет времени ответа сервера невозможен.

Ответы

Ответ 1

Попробуйте следующее:

Сначала создайте ajax-вызов ping с помощью setInterval каждые 5 секунд

function server_ping()
    {
        $.ajax({
            url:"url to ping",
            type: "POST"
        });
    }
    var validateSession = setInterval(server_ping, 5000);

тогда поставьте ловушку .ajaxError:

$(document).ajaxError(function( event, request, settings ) {
        //When XHR Status code is 0 there is no connection with the server
        if (request.status == 0){ 
            alert("Communication with the server is lost!");
        } 

    });

Помните, что вызовы Ajax по умолчанию асинхронны, поэтому, когда пинги идут на сервер, и запрос не может добраться до сервера, значение статуса XHR равно 0, а .ajaxError будет срабатывать, и вы должны поймать ошибку и обработать как вы этого хотите.

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

Ответ 2

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

Btw, 1) таймаут не всегда означает сетевую ошибку. иногда сервер вниз также вызывает "тайм-аут"

2), если драйвер отключен на клиентском устройстве, xhr.status = 0 и без тайм-аута

Ответ 3

Я столкнулся с аналогичной ситуацией, подобной вашей, и исправил ее, проверив сеть каждые 5 секунд, и если сеть отключена, я бы прервал запрос ajax вручную, который завершит запрос ajax.

Здесь я получаю ajax XmlHttpRequest в событии beforeSend для вызова JQuery ajax и использую этот объект, чтобы прервать запрос ajax в случае сбоя сети.

var interval = null;
var xhr = null;

$.ajax({
     beforeSend: function(jqXHR, settings) {  
          xhr = jqXHR;  // To get the ajax XmlHttpRequest 
     },
     url:'server.php',
     data:'lots of data from 200KB to 5MB',
     type:'post',
     success: function(data)
                {
                    alert('Success');
                  //some stuff on success

                },
      error: function(XMLHttpRequest, textStatus, errorThrown)
                {
                    alert('Failure');
                  //some stuff on failure
                },
      complete: function(data)
                {
                    alert('Complete');
                    //To clear the interval on Complete
                    clearInterval(interval);
                },
    });

interval = setInterval(function() {
    var isOnLine = navigator.onLine;
        if (isOnLine) {
            // online
        } else {
             xhr.abort();
        }
     }, 5000);

Ответ 4

У меня была аналогичная проблема, и я решил ее с помощью simpel try/catch и повторной попыткой задержать (скажем) 2 секунды:

function myAjaxMethod()
{
  try 
  {
    $.ajax({ ... });
  } catch (err) 
  { 
    console.log(err.message); 
    setTimeout(function(){myAjaxMethod(),2000});
  }
}

Ответ 5

Попробуйте добавить тайм-аут: при построении $.ajax({}).

Также убедитесь, что вы установите кеш: false, иногда полезно.

Обратитесь к JQuery ajax(): http://api.jquery.com/jQuery.ajax/#toptions

Здесь вы получите гораздо больше информации.

Моя мысль о вашей проблеме [обновлено]

@RiteshChandora, я понимаю вашу озабоченность здесь. Как бы то ни было, я могу предложить вам сделать 2 вещи.

  • Поскольку у вас есть данные в диапазоне от 200 кб до 5 мб, вы можете выбрать максимальный тайм-аут. и триггер для того же самого. Да, это может быть проблематично, но с выбранным вами дизайном единственный способ контролировать ход POST - это сделать так. если нет, см. пункт 2.

  • Я прошел через поток, вы просите пользователя скопировать ответ Json из FB на ваш URL. здесь есть некоторые проблемы,

  • Данные json имеют конфиденциальную информацию о пользователе, и он отправляет его на URL-адрес без SSL-шифрования.

  • Почему вы должны предлагать пользователю публиковать полученные данные на вашем сервере? это должно быть проще, если вы используете пользовательские скрипты. Кроме того, вы никогда не должны отправлять огромные данные от клиента на сервер в подобных случаях, где вы могли бы получить ту же форму, что и FBserver- > ваш sevrer на стороне сервера.

Мое предлагаемое решение: после аутентификации пользователя найдите список своих друзей на стороне сервера. сделайте все, что хотите на стороне сервера, и покажите результат на экране пользователя.

Таким образом, все бремя будет зависеть от вашего сервера, также пользователю не нужно делать какие-либо неприятные сообщения json на вашем URL-адресе.

Кстати, ваша идея приложения классная.

Ответ 6

   error: function(xhr, textStatus, thrownError)
                    {
                       alert(xhr.status);
                       alert(thrownError);
                       alert(textStatus);

                    }

Попробуйте их. TextStatus (кроме нуля) - это "тайм-аут", "ошибка", "прервать" и "parsererror". Когда возникает ошибка HTTP, thrownError получает текстовую часть статуса HTTP, такую ​​как "Не найден" или "Внутренняя ошибка сервера".

Если Интернет отключится, ответ не будет принят и максимум будет сообщением о тайм-ауте.