在我的JS应用程序中,我有许多使用async: false
的Ajax调用。我正在使用最新的Chrome浏览器,最近在我的控制台中出现了以下警告。
主线程上的同步XMLHttpRequest已被弃用,原因是其对最终用户体验的有害影响。为了获得更多帮助,检查http://xhr.spec.whatwg.org/.
现在我正在尝试将所有async: false
更改为async: true
。但它会导致很多错误,因为我的应用程序需要使用async: false
运行。
这个警告只是一个bug还是什么?我能担心还是忽略它?
JavaScript只在UI线程上运行,因此同步AJAX调用将完全冻结浏览器,直到服务器回复。
在web应用程序的用户体验设计中,这被认为是一种糟糕的做法,主流浏览器都在抨击这一功能,转而支持带有回调的异步请求。
你现在可以不用担心这个消息了。这不是一个bug,但我强烈建议您开始重写它,因为当一个功能被标记为不推荐使用时,这意味着他们可以在未来任何时候删除该功能。
它也被jQuery 1.8+弃用
从jQuery 1.8开始,在jqXHR($.Deferred)中使用async:false是不赞成;必须使用success/error/complete回调选项而不是jqXHR对象的相应方法,例如jqXHR.done()或已弃用的jqXHR.success()
推荐的方式:
var request = $.ajax({
url: "script.php",
data: { id : menuId },
dataType: "application/json"
});
request.done(function(data) {
// Executed in case of success
});
request.fail(function( jqXHR, textStatus ) {
// Executed in case of error
});
这个警告只是一个bug还是什么?
不,这不是bug。由于消息中所述的原因,同步请求确实被否决了。
我能担心还是忽略它?
你应该听从建议,对你的应用程序进行适当的更改(是的,这并不像将async: false
更改为async: true
那么简单)。
也许这有助于更好地理解异步操作:
- 为什么我的变量在函数内部修改后没有改变?-异步代码参考
- 如何从异步调用返回响应
此消息告诉您async: false
会造成糟糕的用户体验。这是因为它在ajax调用期间会锁定浏览器。这不是一个错误,而是一条咨询信息,解释你正在做一些你可能不应该做的事情。
我很少看到对async: false
的合理需求,但使用async: true
进行编程(为了创造更好的用户体验)需要编写能够使用异步操作的代码。这是你必须学会如何做的事情,但一旦学会了,这是非常可行的。
您不能简单地将编写为同步运行的代码更改为异步,并期望同步代码能够工作。相反,您必须更改代码以处理异步响应,并且您通常必须将使用该响应的一些代码重组为异步响应处理程序。
如果您想了解如何使用异步ajax开始编码,那么我建议您阅读这个问题及其各种答案:如何从异步调用返回响应?
它告诉您,如果服务器关闭,您将面临锁定浏览器的风险。
设置一个带有取消按钮的模式对话框,并异步调用该函数。
这个警告只是一个bug还是什么?
警告本身不是错误。它警告您代码中可能存在错误。您的代码使用的功能已被弃用,这意味着它将按照您的期望工作的保证越来越小。警告只是警告您这一点。
我能担心还是忽略它?
忽视警告通常是个坏主意。当它们最终成为错误时,停机时间只能怪你自己。
但它会导致很多错误,因为我的应用程序需要使用
async: false
运行
你把因果关系搞混了。async: true
没有引起错误,代码是。这些错误应该被纠正,而不是被规避。通过使用async: false
来避免错误,只需将修复延迟到以后。此警告告诉您"稍后"即将到来,并建议您在问题恶化之前解决问题。
如果您的应用程序"需要使用async: false
运行",则说明您的应用软件设计错误。警告是建议你修复它。这里的其他人也是。