3

在使用 angular + requirejs 进行开发期间。我遇到了一个奇怪的问题。

如果我快速刷新页面(如按 F5),几次后,我将收到以下错误消息,页面不再工作,甚至再次刷新页面,除非清理缓存并在新选项卡上打开页面:

Error: $digest already in progress
    at Error (<anonymous>)
    at beginPhase (http://www.caoglish.info/angular_bug/assets/vendor/angular/angular.js:8495:15)
    at Object.Scope.$apply (http://www.caoglish.info/angular_bug/assets/vendor/angular/angular.js:8297:11)
    at done (http://www.caoglish.info/angular_bug/assets/vendor/angular/angular.js:9357:20)
    at completeRequest (http://www.caoglish.info/angular_bug/assets/vendor/angular/angular.js:9520:7)
    at XMLHttpRequest.xhr.onreadystatechange (http://www.caoglish.info/angular_bug/assets/vendor/angular/angular.js:9490:11)
    at http://www.caoglish.info/angular_bug/assets/vendor/angular/angular.js:9499:11
    at sendReq (http://www.caoglish.info/angular_bug/assets/vendor/angular/angular.js:9333:9)
    at $http (http://www.caoglish.info/angular_bug/assets/vendor/angular/angular.js:9124:17)
    at Function.$http.(anonymous function) (http://www.caoglish.info/angular_bug/assets/vendor/angular/angular.js:9267:18) 

这个错误似乎只发生在 chrome 中。我尝试在 IE 和 Firefox 上触发它,但没有发生。但是,我在慢速计算机上用 chrome 尝试它,它也没有发生。

我触发此问题的计算机具有 i7 cpu,8gb ram.angular 我使用的是 1.0.8。

我附上了我的代码,它隔离了这个问题。我的项目代码比这个更复杂,所以触发它的时间更少。孤立的代码可能需要在 F5 上按更多次才能触发问题。

孤立的示例代码:链接

如何触发错误:视频

快速按 F5 直到它发生。

我在 Angular 项目上创建了一个问题帖子:链接

4

1 回答 1

1

这个问题可能已经死了,但我看到了同样的行为。这绝对不是 Angular 问题。这只是一个简单的竞争条件,或多或少是不可避免的。当您按下 F5 时,出于安全原因,浏览器会暂停“沙箱”中正在进行的所有操作:对 IMG 内容、XHR 请求、Angular 代码运行的主线程等的标准请求。它非常快但不是即时的,并且如果你努力破坏它,你就会成功。

IMO这里的根本问题应该是这是否“坏”,对我来说,这意味着它要么a)造成安全漏洞,要么b)做一些可能破坏重要数据的事情。

您可以排除第一个,因为只有在按下 F5 时已经在浏览器中运行的代码可能会尝试利用此处竞争条件中出现的任何边缘情况。如果它已经在浏览器中运行,它可以做任何想做的事情,因为它已经“在墙内”了。

您可以排除第二个,因为您不应该设计需要 100% 确信下一行代码将被执行的 Web 应用程序……因为您知道这永远无法确定。用户可以在他们想要的任何时候关闭浏览器,并且一旦您假设您必须以某种方式编码以容忍这些情况。

于 2014-06-20T13:32:34.357 回答