在使用 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 直到它发生。
我在 Angular 项目上创建了一个问题帖子:Link
最佳答案
这个问题可能已经死了,但我看到了同样的行为。这绝对不是 Angular 的问题。这只是一个简单的竞争条件,它或多或少是不可避免的。当您按下 F5 时,出于安全原因,浏览器会停止“沙箱”中发生的所有事情:对 IMG 内容的标准请求、XHR 请求、运行 Angular 代码的主线程等。它非常快但不是即时的,并且如果您努力破坏它,您就会成功。
IMO 这里的根本问题应该是这是否“不好”,对我来说,这意味着它是 a) 造成安全漏洞,还是 b) 做一些可能破坏重要数据的事情。
您可以排除第一个,因为只有在按下 F5 时已经在浏览器中运行的代码才有可能尝试利用竞争条件中出现的任何边缘情况。如果它已经在浏览器中运行,它可以做任何它想做的事情,因为可以说它已经“在墙内”。
您可以排除第二种,因为您不应该设计要求 100% 确信下一行代码将被执行的 Web 应用程序……因为您知道这永远无法确定。用户可以随时关闭浏览器,一旦您假设您必须以这种方式编写代码以容忍这些情况。
关于javascript - Angular + requirejs : quick refreshing pages cause page stop working in chrome,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19759937/