在使用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:快速刷新页面导致页面停止在chrome中工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19759937/