За последние 24 часа нас посетили 20616 программистов и 1104 робота. Сейчас ищут 422 программиста ...

Зависает клиент на $.pjax.reload()

Тема в разделе "Yii", создана пользователем onderbert, 11 авг 2020.

  1. onderbert

    onderbert Новичок

    С нами с:
    24 мар 2019
    Сообщения:
    18
    Симпатии:
    1
    Всем привет, есть виджет который раз в минуту делает аякс запрос и обновляет сам себя.
    Все то хорошо, только вот проблема. Если оставить на долго вкладку открытой и не обновлять страницу тупо зависает клиент (браузер). Возможно кто то сталкивался с данной проблемой, толкните в нужном направлении.

    Код (Javascript):
    1. /**
    2. * Init new request observer
    3. *
    4. * @param delay {integer|string}
    5. * @param observerUrl {string}
    6. * @param widgetViewUrl {string}
    7. */
    8. function initNewRequestObserver(delay, observerUrl, widgetViewUrl) {
    9.     var delayCall = parseInt(delay);
    10.     if (delayCall > 0) {
    11.         delayCall = delayCall * 1000;
    12.         setTimeout(function checkNewRequest() {
    13.             $.ajax({
    14.                 type: 'POST',
    15.                 url: observerUrl,
    16.                 success: function (r) {
    17.                     if (typeof r !== "undefined") {
    18.                         var count = parseInt(r),
    19.                             countEl = $(document).find('#new-request-count'),
    20.                             containerID = '#request-notification';
    21.                         pjaxContainerReload(containerID, widgetViewUrl);
    22.                         if (countEl.length > 0) {
    23.                             if (count > 0) {
    24.                                 countEl.removeAttr('style');
    25.                                 countEl.html(count);
    26.                             } else {
    27.                                 countEl.css({display: 'none'});
    28.                                 countEl.html('');
    29.                             }
    30.                         }
    31.                     }
    32.                 }
    33.             });
    34.             setTimeout(checkNewRequest, delayCall);
    35.         }, delayCall);
    36.     }
    37. }
    38.  
    39. /**
    40. * Reload pjax container
    41. *
    42. * @param containerID {string}
    43. * @param pjaxUrl {string|undefined}
    44. */
    45. function pjaxContainerReload(containerID, pjaxUrl) {
    46.     var gridEl = $(containerID);
    47.     if (gridEl.length > 0) {
    48.         var pjaxOptions = {
    49.             container: containerID,
    50.             timeout: false,
    51.             scrollTo: false,
    52.             //async: false,
    53.             push: false,
    54.             replace: false
    55.         };
    56.         if (typeof pjaxUrl === 'string') {
    57.             pjaxOptions.type = 'POST';
    58.             pjaxOptions.url = pjaxUrl;
    59.         }
    60.         $.pjax.reload(pjaxOptions);
    61.     }
    62. }
     
  2. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    почитайте про setTimeout https://learn.javascript.ru/settimeout-setinterval

    сильно не вникал, но надо вам как то так:
    Код (Javascript):
    1. function initNewRequestObserver(delay, observerUrl, widgetViewUrl) {
    2.     var delayCall = parseInt(delay);
    3.     if (delayCall > 0) {
    4.         delayCall = delayCall * 1000;
    5.    
    6.         $.ajax({
    7.             type: 'POST',
    8.             url: observerUrl,
    9.             success: function (r) {
    10.                 if (typeof r !== "undefined") {
    11.                     var count = parseInt(r),
    12.                         countEl = $(document).find('#new-request-count'),
    13.                         containerID = '#request-notification';
    14.                     pjaxContainerReload(containerID, widgetViewUrl);
    15.                     if (countEl.length > 0) {
    16.                         if (count > 0) {
    17.                             countEl.removeAttr('style');
    18.                             countEl.html(count);
    19.                         } else {
    20.                             countEl.css({display: 'none'});
    21.                             countEl.html('');
    22.                         }
    23.                     }
    24.                 }
    25.             }
    26.         });
    27.  
    28.         setTimeout(initNewRequestObserver, delayCall, delay, observerUrl, widgetViewUrl);
    29.     }
    30. }
    а у вас же два setTimeout вызывают друг друга, и через каждую минуту они множатся в куб. И когда их уже за сотни вызовов в минуту, у вас все виснет.
     
    #2 Artur_hopf, 11 авг 2020
    Последнее редактирование: 11 авг 2020
  3. onderbert

    onderbert Новичок

    С нами с:
    24 мар 2019
    Сообщения:
    18
    Симпатии:
    1
    --- Добавлено ---
    У вас там опечатка, в вызове. Он сам себя вызывает, Такой себе аналог setInterval()
    Код (Javascript):
    1. setTimeout(checkNewRequest, delayCall);
    Проблема скорее всего в pjax. Переписал код так, что апдейт dom делаю сам руцями. Поставил интервал 2 сек и оставил на пол часа. Проблема исчезла.