Я читал из нескольких мест, которые setTimeout() предпочтительнее для setInterval(), когда вы устанавливаете что-то, чтобы в основном работать вечно. Код ниже работает нормально, но примерно через час работы Firefox (38.0.1) выдает ошибку too much recursion
.jquery setTimeout слишком много рекурсии
По существу, у меня он захватывает очень небольшое количество текста из counts.php и обновляет таблицу с помощью этой информации. По словам инспектора, весь призыв и возвращение занимает около 50 мс. Я пытаюсь сделать это каждые шесть секунд по указанию t
.
Я подозреваю, что если я переключусь на setInterval(), это, вероятно, сработает, но я не был уверен, что текущее состояние метода setTimeout() и setInterval(), как и все, что я нашел, 5 лет.
$(document).ready(function() {
t = 3000;
$.ajaxSetup({cache: false});
function countsTimer(t) {
setTimeout(function() {
$.getJSON("counts.php", function (r) {
$(".count").each(function(i,v) {
if ($(this).html() != r[i]) {
$(this).fadeOut(function() {
$(this)
.css("color", ($(this).html() < r[i]) ? "green" : "red")
.html(r[i])
.fadeIn()
.animate({color: '#585858'}, 10000);
})
};
});
t = $(".selected").html().slice(0,-1) * ($(".selected").html().slice(-1) == "s" ? 1000 : 60000);
countsTimer(t);
});
}, t);
};
countsTimer(t);
});
Update: Эта проблема была решена путем добавления .stop (правда, истина) до .fadeOut() анимации. Эта проблема произошла только в Firefox, поскольку тестирование в других браузерах не вызвало никаких проблем. Я правильно ответил на этот вопрос, несмотря на то, что это не решение в данном конкретном случае, а скорее дает хорошее объяснение в более общем смысле.
Я не знаю, почему 'setInterval' не следует использовать. Каковы были причины? Похоже на ложные претензии или причины, которые имеют отношение только к конкретным ситуациям. –
Мне интересно, если очистка таймаута устранит эту проблему, даже если я действительно не уверен, откуда происходит рекурсия –
@squint, чтобы избежать какой-либо проблемы, если запрос делает больше, чем задержка, чтобы завершить –