ResizeObserver-超出循环限制


143

大约两个月前,我们开始使用Rollbar通知我们Web应用程序中的各种错误。从那时起,我们一直遇到偶尔的错误:

ResizeObserver loop limit exceeded

让我感到困惑的是,我们没有使用它,ResizeObserver而我调查了我认为唯一可能是罪魁祸首的插件,即:

Aurelia调整大小

但它似乎都没有使用ResizeObserver

令人困惑的是,自一月份以来就一直出现这些错误消息,但ResizeObserver仅在最近才对Chrome 65添加了支持。

一直给我们这个错误的浏览器版本是:

  • Chrome:63.0.3239(超出了ResizeObserver循环限制)
  • Chrome:64.0.3282(超出了ResizeObserver循环限制)
  • 边缘:14.14393(SecurityError)
  • 边缘:15.15063(SecurityError)

所以我想知道这是否可能是浏览器错误?还是实际上与错误无关的错误ResizeObserver


2
有趣的是,甚至文档怎么说ResizeObserver has a mechanism to avoid infinite callback loops and cyclic dependencies。您最近是否更新了对element-resize-detector的依赖关系(aurelia-resize的依赖关系)?看来,一个曾在1月份更新..
弗雷德Kleuver

3
作为解决方法,您可以window.ResizeObserver = undefined;在应用程序开始时禁用ResizeObserver。当然不是最好的解决办法,但只是恢复它回到它是什么的时候,它的工作..
弗雷德Kleuver

1
您能提供代码的复制品吗,是的ResizeObserver允许UA循环(以未指定的限制)以保释。由于我们目前不支持ResizeObserver,因此边缘安全错误将完全不同。
gregwhitworth

1
@IOIIOOIO,请考虑添加您自己的回应以反映您的决定。
亚历山大·塔兰

57
此错误意味着ResizeObserver无法在单个动画帧中提供所有观察值。这是良性的(您的网站不会损坏)。
Aleksandar Totic

Answers:


218

您可以放心地忽略此错误。

一位规范作者在对您的问题的评论中写道,但这不是答案,并且在评论中尚不清楚答案确实是该主题中最重要的答案,而这个答案让我很容易在其中忽略它。我们的哨兵日志。

此错误意味着ResizeObserver无法在单个动画帧中提供所有观察值。这是良性的(您的网站不会损坏)。– Aleksandar Totic 4月15日在3:14

规范存储库中与此相关的还有一些问题



我们遇到此问题的@microsoft/applicationinsights-web原因是我们的客户端错误日志记录来自哪里。所以,我们只是忽略错误事件处理程序设置之前applicationInsights和呼叫此错误stopImmediatePropagationpreventDefault
JohnnyFun

@JohnnyFun关于如何在野生动物园中进行操作的任何想法?不管我只得到“脚本错误”。当此事件发生时
NSjonas

36

这是一个古老的问题,但对某人可能仍然有所帮助。您可以通过将回调包装在中来避免此错误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)||!entries.length”
赛义德·塞菲

你什么意思?
拉尼

1
您怎么知道要这样做...?
ADJenks

8

如果您使用的是赛普拉斯(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
    }
})

您可以在此处关注有关它的讨论。赛普拉斯的维护人员自己提出了该解决方案,因此我相信这样做是安全的。


4

我们有同样的问题。我们发现罪魁祸首是镀铬。特别是,织机chrome扩展名引起了错误(或代码与织机扩展名的某些交互)。当我们禁用扩展程序时,我们的应用程序正常工作。

我建议禁用某些扩展名/附件,以查看其中是否可能导致了错误。


1
或仅以隐身模式查看。大多数人可能没有任何隐身功能,或者启用隐身功能的扩展较少。
Jayant Bhawal'4

2

对于Mocha用户:

下面的代码片段覆盖了window.onerror挂钩摩卡安装程序,并将错误转换为警告。 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);

为我修复了此错误

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.