Ajax - проверка соединения - PullRequest
1 голос
/ 14 июля 2011

Я пишу приложение для веб-чата.Он использует длинный механизм опроса.По сути, вы отправляете запрос на сервер, и сервер удерживает его до тех пор, пока не будет данных для отправки обратно.Затем он отвечает, а затем клиент отправляет другой запрос на сервер.И цикл повторяется.

Однако есть проблема - у меня нет проверки на месте.Что делать, если связь обрывается?Допустим, я разговариваю с другом, а затем мой Wi-Fi падает.Интернет не работает, и, скажем, через минуту он снова включитсяНо затем механизм длительного опроса уже умер, и без опроса я должен обновить страницу.

Как реализовать механизм проверки ошибок, чтобы решить проблему неудачных или разорванных сетевых подключений?Я использую jQuery для облегчения запросов Ajax, если это поможет.

* РЕДАКТИРОВАТЬ: Вот мой код JS для механизма опроса: *

// Polls the server for more data, basically a regular encrypted request
Minte.Network.poll = function()
{
    // If client is not connected, do not send poll requests
    if (!Minte.Client.connected)
        return; 

    Minte.Network.request({ "action" : "poll"}, function(data) {

        // If a client has disconnected and a poll returns afterwards, do not process it
        if (!Minte.Client.connected)
            return;

        Minte.Network.lastPoll = Minte.clock.getTime(); 
        Minte.Processor.process(data); 
        Minte.Network.poll(); 
    }); 
}; 


// Send a regular, routine encrypted request
Minte.Network.request = function(data, callback) 
{

    $.post(SERVER_URI, data, function(data, textStatus, jqXHR) {
        data = JSON.parse(data); 
        callback(data); 
    }); 
}; 

1 Ответ

1 голос
/ 14 июля 2011

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

Секунда, если вы хотите получить более быструю обратную связь иболее вероятно, что он будет согласованным даже в разных браузерах, тогда ваш сервер сможет вернуть сердцебиение.Таким образом, каждые XX секунд бездействия ваш сервер будет возвращать ответ сердцебиения.Клиент будет ждать, xx + yy секунд (yy - это дополнительное время, чтобы учесть время приема-передачи и небольшое отставание в ответе сервера), и если он не получит ни фактическую дейтаграмму от сервера, ни ответный сигнал, то онпредположил бы, что связь умерла.Если он получает сердцебиение, он просто делает еще один запрос.Вы можете установить сердцебиение на любой желаемый интервал, хотя очевидно, что короткие промежутки времени более обременительны для серверной инфраструктуры.

К вашему сведению, jQuery имеет глобальный обработчик ошибок ajax, описанный здесь: http://api.jquery.com/ajaxError#callback и jQueryСам вызов ajax позволяет указать время ожидания и обработчик ошибок.

В псевдокоде:

$.ajax({
   url: 'xxxx',
   success: function(data, textStatus, jqXHR) {
      if (data is heartbeat) start a new ajax connection to ask again
      if (data has returned data in it) process it
   };
   error: function(jqXHR, textStatus, errorThrown) {
       some sort of connection error has happened
   };
   timeout: 2 * 60 * 1000;   // 2 minutes
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...