Почему setTimeout такой непостоянный и полуфункциональный?
-
22-09-2019 - |
Вопрос
function load_result()
{
$.getJSON( "http://somesite.com/loadresult.php", function(data) {
if( data == undefined || data == null )
{
console.log( "no data" );
clearTimeout( lr_timeout );
lr_timeout = setTimeout( "load_result()", 2000 );
return;
}
insert_result_price( data );
clearTimeout( lr_timeout );
lr_timeout = setTimeout( "load_result()", 50 * ( Math.random() * 10 ) );
} );
}
и lr_timeout
определяется глобально, и load_result
функция запускается изначально в document.ready
функция.Проблема в том, что функция выполняется не всегда.Я посмотрю это в Firebug, и у меня есть другая функция, установленная в setInterval, которая всегда работает.
Идеи?
Решение
Это ваш другой setTimeout
функция (та, которая всегда работает) также внутри $.getJSON
?Если да, вызывает ли он его по тому же URL-адресу (http://somesite.com/loadresult.php
в вашем примере, но я уверен, что в реальной жизни все по-другому)?
Вполне возможно, что http://somesite.com/loadresult.php
является ненадежным ресурсом, и ваши противоречивые результаты обусловлены этим ресурсом, а не setTimeout
.Конечно, если они оба используют один и тот же ресурс, то это не может быть проблемой.
Другие советы
У меня никогда не возникало проблем с setTimeout в целом, и я использовал его для основного / бесконечного цикла в JS довольно много раз без каких-либо проблем.Я бы предположил, что clearTimeout из одного вызова load_results переходит в setTimeout из другого, тем более что это происходит в ответ на запрос GET, который может занять больше времени, чем требуется браузеру для перехода к следующему setTimeout.На самом деле здесь задействовано несколько потоков, у вас просто нет контроля над ними, и нет доступного механизма синхронизации.