Ajax-код, который я использую для запроса страницы, потребляет слишком много памяти и делает браузер медленным, и все отстает. Кажется, что происходит рекурсия, и я не знаю, как это предотвратить. Вот как выглядит код.
$(".item").each(function() {
$this = $(this);
var dataString = {s: "<?echo $_SESSION['currentview_'.$stamp]?>", r:"<?echo $search_usernumber?>", st: "<?echo $stamp?>"};
$.ajaxSetup({cache:false});
function timeLeft() {
$.ajax({
type: "POST",
url: "get_content_home.php",
dataType: "html",
data: dataString,
success: function(result) {
$this.html(result);
//console.log("a");
window.setInterval(function() {
timeLeft();
}, 500);
}
});
}
timeLeft();
});
Как я могу решить эту проблему? Спасибо заранее.
Вы рекурсивно, и вы не должны использовать эту форму вложенного
setInterval
. Это приведет к взрыву интервальных экземпляров. Вместо использованияsetInterval
расписание дополнительных запросов с помощьюsetTimeout
.setInterval
будет срабатывать и продолжать стрелять каждый интервал, пока вы не скажете ему остановиться .setTimeout
будет запускаться один раз.Давайте рассмотрим следующий код, который должен решить некоторые из проблем, которые возникают у вас в этом вопросе, а также ваши другие 2 вопроса.
Прежде всего, как мы уже говорили, не используйте
setInterval
, если вы на самом деле не хотите, чтобы он запускался вечно. Кроме того, не создавайте гнездо творенияsetInterval
, если вы на самом деле не имеете в виду.Вместо этого давайте создадим рекурсивную функцию
getTimeLeft()
, которая будет обрабатывать запрос и планировать следующую проверку на время, оставшееся после некоторой продолжительности.В этом примере также издевается функция
$.ajax()
, чтобы вы могли видеть эту функцию в действии, t иметь фактический задний конец для использования.Этот код рассмотрит проблему что у вас есть в 2 Ajax non-blocking , потому что у каждого элемента будет своя собственная логика перехода и выбор времени и само обновление.
Это также адреса проблема, с которой вы потенциально сталкиваетесь в Timer в Ajax - Preemption , потому что теперь элемент не будет проверять, сколько времени осталось до тех пор, пока не завершится предыдущая проверка.