不推荐使用主线程上的同步XMLHttpRequest错误

时间:2015-09-22 21:02:31

标签: angularjs

出于某种原因,我在Angularjs应用中遇到以下错误:

主线程上的同步XMLHttpRequest因其对最终用户体验的不利影响而被弃用。

由于我还没有弄清楚导致它的原因,我不知道要分享哪些代码? 当我导航到状态(ui-router)但没有与此状态相关联的控制器时,会出现问题。

之前有人见过这个吗?

2 个答案:

答案 0 :(得分:3)

这是因为尝试从浏览器进行同步AJAX调用。

如果Ajax调用是通过jQuery完成的,那么在使用时会导致:

async: false

作为任何jQuery ajax调用的参数。

如果使用原生XMLHttpRequest完成,则会在第三个参数发生时导致:

xmlhttp.open(...)

设置为false

因此,问题的根源是从您的网页Javascript进行的ajax调用。您将不得不检查所有进行Ajax调用的地方,并找到一个设置错误参数的地方,修复参数并(可能)重做响应处理以使用异步响应。

这里有一些关于在Angular中进行同步ajax调用的方法的文章,因此它可以让你知道要查找的内容:

How to $http Synchronous call with AngularJS

How to create synchronous using $http in angular.js

由于angular默认情况下只执行异步,因此看起来您必须不遗余力地创建自己的服务。为此,您将使用原生XMLHttpRequest对象,这样您就可以很好地使用XMLHttpRequest的代码并查看引用的位置,然后在该邻域中找到.open()调用。< / p>

答案 1 :(得分:2)

我的生产服务器中有Synchronous XMLHttpRequest on the main thread is deprecated,而本地环境中没有此类错误。

在我的情况下,这是由于模板名称与js请求不匹配:

  • AngularJS(在我的情况下是指令)请求小写mytemplate.tmpl.html
  • 模板文件以camelCase命名:myTemplate.tmpl.html

令人困惑的问题是指令/模板在Mac上运行良好(由于OSX case-insensitivity) - 但在推送到Linux case-sensitive AWS生产服务器时失败。

将模板文件名更改为小写可修复问题。

正如上面其中一条评论中所提到的,AJAX错误具有误导性,因为它意味着调用本身有问题,而不仅仅是文件是&#34;缺少&#34;。