Вызовы событий прокрутки выполняются все большее число раз при каждой прокрутке внутри функции успеха ajax

#javascript #jquery #ajax

#javascript #jquery #ajax

Вопрос:

Контекст

У меня есть страница на моем сайте, куда загружаются комментарии пользователей. После загрузки комментариев, когда пользователь прокручивает страницу до конца, загружается больше комментариев. Я помещаю этот код прокрутки в нижней части обратного вызова AJAX success, который получает комментарии, потому что если оставить его вне вызова AJAX, функция AJAX запускается несколько раз, дважды загружаясь в одни и те же комментарии. Код AJAX выглядит примерно так:

 
function getArticleHighlightResponses() {

$.ajax({
    url: 'includes/articles/getArticleHighlightResponses.php',
    type: 'POST',
    data: {articleId: articleId, commentId: commentId, contenttype: contenttype, offset: getHighlightArticleResponsesOffset},
    dataType: 'json',
    success: function(data) {
        data.forEach(function(item) {

        //do stuff in here    

        });

        getHighlightArticleResponsesOffset = getHighlightArticleResponsesOffset   10;

        $(window).on("scroll", debounce(function() {

            if ($(window).scrollTop()   $(window).height() == $(document).height()) {

                <?php if (isset($_GET['getSpecificComment'])) { ?>

                    var commentId = "<?php echo $_GET['commentId']; ?>";
                    var contenttype = "<?php echo $_GET['contenttype']; ?>";
                    getArticleHighlightResponses(commentId, contenttype);

                <?php } else { ?> 

                    getArticleHighlightResponses();

                <?php } ?>

            }

        }, 50));

    }
}); 

}
  

Вызов этого кода прокрутки внутри обратного вызова AJAX success устраняет проблему двойной загрузки комментариев, но каждый раз, когда я прокручиваю страницу вниз, функция getArticleHighlightResponses() вызывается в два раза чаще, чем в предыдущий раз; если я прокручиваю страницу вниз один раз, она вызывается один раз. Если я делаю это снова, оно вызывается дважды. Если я сделаю это снова, это будет вызвано четыре раза. Если я сделаю это еще два раза, в общей сложности пять раз, это вызовется 16 раз. Это приводит к множеству вызовов функций всякий раз, когда я прокручиваю страницу вниз, когда я хочу, чтобы функция была вызвана только один раз.

Вопрос

Есть ли что-то в природе обратного вызова AJAX success, из-за чего события запускают функции слишком много раз?

Комментарии:

1. Нет, вы добавляете обратные вызовы внутри вашего метода успеха ajax. Таким образом, чем больше запросов ajax вы делаете, тем больше обратных вызовов вы добавляете.

2. @Eldar Это причина, по которой функция вызывает double каждый раз?

3. Да, и не только двойное количество обратных вызовов будет равно вызовам ajax.

4. @Eldar Знаете ли вы способ отменить это, чтобы обратные вызовы не складывались?

5. Вы можете удалить этот код, добавив scroll обработчик событий из обратного вызова. Тогда вам нужно что-то вроде автоматического выключателя. После того, как вы вызвали getArticleHighlightResponses функцию в своем обработчике событий, она не должна вызывать этот метод снова, пока он не завершится. Вы можете использовать переменную для отслеживания статуса вызова ajax.