2015-08-14 10 views
1

Я пишу сценарий опроса для получения вновь созданных записей данных. Я хочу выполнить вызов каждые N секунд.Асинхронный опрос JavaScript замораживает браузер с помощью setTimeout или setInterval

Я попытался setTimeout() и setInterval() запустить опрос асинхронно, но и замораживать браузер при выполнении функции Polling(), которая на самом деле странно для меня.

Я вызываю функцию StarPolling(), когда страница загружена. APICall() Функция jQuery $.POST Функция, которая работает хорошо - и асинхронно - в любых других ситуациях.

Это код, я использую с setTimeout()

var pollinginterval = 5000; 
function StartPolling() 
{ 
    setTimeout(Polling, pollinginterval); 
} 

function Polling() 
{ 
    [... some code ...] 

    var api_call = 'API_URL'; 
    var api_call_parameters = { 
     [...] 
    }; 
    APICall(api_call, api_call_parameters, function(json_response) 
    { 
     /* this is the callback belongs to the $.POST request */ 

     [... some code ...] 

     setTimeout(Polling, pollinginterval); 
    }); 
} 

версия, которую я попытался с помощью setInterval() очень похоже, за исключением рекурсивного вызова.

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

Есть ли способ запустить опрос в РЕАЛЬНОГО асинхронным способом, или с помощью новой «нити» с JavaScript без замораживания браузера?

UPDATE: Это как APICall() работает:

function APICall(call, parameters, success_callback) 
{ 
    $.post(apibase + "" + call,parameters) 
    .done(function(response){ 
     try 
     { 
      var json_response = $.parseJSON(response); 
     } 
     catch(error) 
     { 
      [...] 
     } 

     if(json_response.header.status == "OK") 
     { 
      success_callback(json_response); 
     } 
     else if(json_response.header.status == "error") 
     { 
      [...] 
     } 
    }) 
    .fail(function(error) { 
     [...] 
    }); 
} 

UPDATE: Я тестирование опроса с нормальным и частным окном браузера (Firefox) в то же самое время, чтобы попробовать функциональность , Я только заметил, что проблема возникает только тогда, когда оба окна запускают опрос одновременно.

Может быть, это ошибка светлячок ...

+5

Что именно делает 'APICall'? Вот в чем проблема. Это делает синхронный AJAX? – Pointy

+0

@Pointy Это может быть, но маловероятно, поскольку он имеет обратный вызов? Может быть, он поддерживает оба? –

+0

Я обновил свой вопрос с помощью функции APICall –

ответ

-1

Вы можете использовать длинный шаблон опроса, как это:

(function Polling() { 
    setTimeout(function() { 
     $.ajax({ url: "server", success: function(response) { 
      //your try/catch here 
     }, dataType: "json", complete: Polling }); 
    }, 5000); 
})(); 

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

+0

Правильно, но что случилось с его нынешним узором? почему бы это заморозить браузер? –

+0

Возможно, на стороне сервера ... он будет делать запрос каждые 5 секунд, даже если задание сервера еще не закончено. –

+0

, но это просто остановило бы запросы, это не заморозило бы браузер. –

0

OP хочет запустить Polling таким образом, чтобы он не мешал основной теме (то есть в фоновом потоке). Единственный способ сделать это - использовать WebWorker, который он специально не хочет использовать.

Для кучи интересного чтения см. Документ W3 около event loops, но в основном все, что происходит в браузере, однопоточное. Все javascript будет происходить в основном потоке (кроме веб-работников). Все setTimeout и setInterval do - очередь обратного вызова, которая будет запущена в основном потоке через ~ x секунд.

Извините, нет другого пути рядом с веб-работниками.