ResizeObserver - перевищено обмеження циклу


145

Близько двох місяців тому ми почали використовувати Rollbar, щоб повідомляти нас про різні помилки в нашому веб-додатку. З тих пір ми періодично отримуємо помилку:

ResizeObserver loop limit exceeded

Мене бентежить у цьому те, що ми не використовуємо, ResizeObserverі я дослідив єдиний плагін, який, на мою думку, міг бути винуватцем, а саме:

Змінити розмір Аурелії

Але, схоже, він не використовує ResizeObserverжодного.

Що також бентежить, так це те, що ці повідомлення про помилки з’являються з січня, але ResizeObserverпідтримка Chrome 65 була додана нещодавно.

Версії браузера, які спричинили цю помилку:

  • Chrome: 63.0.3239 (перевищено обмеження циклу ResizeObserver)
  • Chrome: 64.0.3282 (перевищено обмеження циклу ResizeObserver)
  • Край: 14.14393 (Помилка безпеки)
  • Край: 15.15063 (SecurityError)

Тож мені було цікаво, чи це може бути помилка браузера? Або, можливо, помилка, яка насправді не має нічого спільного ResizeObserver?


2
Забавно, як кажуть навіть документи ResizeObserver has a mechanism to avoid infinite callback loops and cyclic dependencies. Ви нещодавно оновлювали залежність до element-resize-detector (залежність aurelia-resize)? Здається, у нього було оновлення в січні ..
Фред Кловер

3
Як обхідний шлях, який ви можете зробити window.ResizeObserver = undefined;на початку програми, щоб просто вимкнути ResizeObserver. Звичайно, не найкраще рішення, але просто повертає його назад до того, що було, коли воно працювало ..
Фред Кловер

1
Чи можете ви надати повторний зміст свого коду, і так, ResizeObserver дає UA-ім вихід (з невизначеним лімітом), щоб вийти на цикл. Помилка Edge Security буде зовсім іншою, оскільки наразі ми не підтримуємо ResizeObserver.
gregwhitworth

1
@IOIIOOIO, будь ласка, додайте власну відповідь, що відображає ваше рішення.
Олександр Таран

58
Ця помилка означає, що ResizeObserver не зміг доставити всі спостереження за один кадр анімації. Це доброякісно (ваш сайт не зламається).
Aleksandar Totic

Відповіді:


220

Ви можете спокійно ігнорувати цю помилку.

Один із авторів специфікації написав у коментарі на ваше запитання, але це не відповідь і не зрозуміло в коментарі, що відповідь насправді є найважливішою у цій темі, і та, завдяки якій мені було зручно її ігнорувати наші журнали Sentry.

Ця помилка означає, що ResizeObserver не зміг доставити всі спостереження за один кадр анімації. Це доброякісно (ваш сайт не зламається). - Олександр Тотіч 15 квітня о 3:14

У сховищі специфікацій до цього також є деякі пов’язані проблеми .



У нас виникла ця проблема, через @microsoft/applicationinsights-webяку реєструється помилка нашого клієнта. Отже, ми просто ігноруємо цю помилку, налаштовуючи обробник подій помилок до applicationInsights і call stopImmediatePropagationіpreventDefault
JohnnyFun

@JohnnyFun будь-які думки про те, як це зробити в сафарі? Незалежно від того, що я отримую лише "помилку сценарію". коли ця подія трапляється
NSjonas

37

Це давнє запитання, але воно все одно може бути корисним для когось. Ви можете уникнути цієї помилки, обернувши зворотній дзвінок requestAnimationFrame. Наприклад:

const resizeObserver = new ResizeObserver(entries => {
   // We wrap it in requestAnimationFrame to avoid this error - ResizeObserver loop limit exceeded
   window.requestAnimationFrame(() => {
     if (!Array.isArray(entries) || !entries.length) {
       return;
     }
     // your code
   });
});

3
чи потрібна умова? "! Array.isArray (записи) ||! Entries.length"
Саїд Сейфі

Що ви маєте на увазі?
Рані

1
Звідки ти знав це робити ...?
ADJenks

8

Якщо ви використовуєте Cypress, і ця проблема виникає, ви можете спокійно проігнорувати його в Cypress, використовуючи наступний код у support / index.js або commands.ts

const resizeObserverLoopErrRe = /^[^(ResizeObserver loop limit exceeded)]/
Cypress.on('uncaught:exception', (err) => {
    /* returning false here prevents Cypress from failing the test */
    if (resizeObserverLoopErrRe.test(err.message)) {
        return false
    }
})

Ви можете слідкувати за обговоренням тут . Оскільки сам розробник Cypress пропонував це рішення, то я вважаю, що це було б безпечно зробити.


4

У нас була така сама проблема. Ми виявили, що винуватцем є розширення хрому. Зокрема, розширення хрому ткацького верстата спричиняло помилку (або деяку взаємодію нашого коду з розширенням ткацького верстата). Коли ми вимкнули розширення, наш додаток працював.

Я б порекомендував вимкнути певні розширення / аддони, щоб перевірити, чи не сприяє помилці одне з них.


1
Або просто перевірити в режимі інкогніто. У більшості людей, ймовірно, немає жодного, або набагато менше розширень, увімкнених в режимі інкогніто.
Джаянт Бхавал,

2

Для користувачів Mocha:

Фрагмент нижче перекриває вікно window.onerror mocha встановлюється і перетворює помилки на попередження. https://github.com/mochajs/mocha/blob/667e9a21c10649185e92b319006cea5eb8d61f31/browser-entry.js#L74

// ignore ResizeObserver loop limit exceeded
// this is ok in several scenarios according to 
// https://github.com/WICG/resize-observer/issues/38
before(() => {
  // called before any tests are run
  const e = window.onerror;
  window.onerror = function(err) {
    if(err === 'ResizeObserver loop limit exceeded') {
      console.warn('Ignored: ResizeObserver loop limit exceeded');
      return false;
    } else {
      return e(...arguments);
    }
  }
});

не впевнений, що є кращий спосіб ..


1

додати розмов як

новий ResizeObserver (_. debounce (entries => {}, 200);

виправила цю помилку для мене

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.