在开发过程中使用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上按下更多次才能触发问题。
隔离的示例代码:Link
如何触发错误:video
快速按F5直到它发生。
我在角项目上创建了一个问题帖子:Link
答案 0 :(得分:1)
这个问题可能已经死了,但我看到了同样的行为。它绝对不是一个Angular问题。这只是一个简单的竞争条件,它或多或少是不可避免的。当你点击F5时,浏览器会出于安全原因暂停“沙盒”中发生的一切:标准请求,例如IMG内容,XHR请求,Angular代码运行的主线程等等。它非常快但不是即时的,并且如果你努力破坏它,你就会成功。
IMO这里的根本问题应该是这是否“坏”,对我来说,这意味着要么a)创建安全漏洞,要么b)做一些可能破坏重要数据的事情。
你可以排除第一个,因为在F5被按下的时候只有已经在浏览器中运行的代码可能会尝试利用竞争条件中出现的任何边缘情况。如果它已经在浏览器中运行,它可以做任何想做的事情,因为它已经“在墙内”可以这么说。
你可以排除第二种,因为你不应该设计那些需要100%确信下一行代码将被执行的Web应用程序......因为你知道这一点永远不会确定。用户可以随时关闭浏览器,并且一旦您认为必须以这样的方式编写代码,以便能够容忍这些条件。