Всем привет, есть виджет который раз в минуту делает аякс запрос и обновляет сам себя. Все то хорошо, только вот проблема. Если оставить на долго вкладку открытой и не обновлять страницу тупо зависает клиент (браузер). Возможно кто то сталкивался с данной проблемой, толкните в нужном направлении. Код (Javascript): /** * Init new request observer * * @param delay {integer|string} * @param observerUrl {string} * @param widgetViewUrl {string} */ function initNewRequestObserver(delay, observerUrl, widgetViewUrl) { var delayCall = parseInt(delay); if (delayCall > 0) { delayCall = delayCall * 1000; setTimeout(function checkNewRequest() { $.ajax({ type: 'POST', url: observerUrl, success: function (r) { if (typeof r !== "undefined") { var count = parseInt(r), countEl = $(document).find('#new-request-count'), containerID = '#request-notification'; pjaxContainerReload(containerID, widgetViewUrl); if (countEl.length > 0) { if (count > 0) { countEl.removeAttr('style'); countEl.html(count); } else { countEl.css({display: 'none'}); countEl.html(''); } } } } }); setTimeout(checkNewRequest, delayCall); }, delayCall); } } /** * Reload pjax container * * @param containerID {string} * @param pjaxUrl {string|undefined} */ function pjaxContainerReload(containerID, pjaxUrl) { var gridEl = $(containerID); if (gridEl.length > 0) { var pjaxOptions = { container: containerID, timeout: false, scrollTo: false, //async: false, push: false, replace: false }; if (typeof pjaxUrl === 'string') { pjaxOptions.type = 'POST'; pjaxOptions.url = pjaxUrl; } $.pjax.reload(pjaxOptions); } }
почитайте про setTimeout https://learn.javascript.ru/settimeout-setinterval сильно не вникал, но надо вам как то так: Код (Javascript): function initNewRequestObserver(delay, observerUrl, widgetViewUrl) { var delayCall = parseInt(delay); if (delayCall > 0) { delayCall = delayCall * 1000; $.ajax({ type: 'POST', url: observerUrl, success: function (r) { if (typeof r !== "undefined") { var count = parseInt(r), countEl = $(document).find('#new-request-count'), containerID = '#request-notification'; pjaxContainerReload(containerID, widgetViewUrl); if (countEl.length > 0) { if (count > 0) { countEl.removeAttr('style'); countEl.html(count); } else { countEl.css({display: 'none'}); countEl.html(''); } } } } }); setTimeout(initNewRequestObserver, delayCall, delay, observerUrl, widgetViewUrl); } } а у вас же два setTimeout вызывают друг друга, и через каждую минуту они множатся в куб. И когда их уже за сотни вызовов в минуту, у вас все виснет.
--- Добавлено --- У вас там опечатка, в вызове. Он сам себя вызывает, Такой себе аналог setInterval() Код (Javascript): setTimeout(checkNewRequest, delayCall); Проблема скорее всего в pjax. Переписал код так, что апдейт dom делаю сам руцями. Поставил интервал 2 сек и оставил на пол часа. Проблема исчезла.