从jQuery 1.8开始,不赞成在jQuery.ajax()中使用async:false
但是,当后台正在进行AJAX通信时,你看到过多少带有"加载屏幕"的网页?我可能见过成千上万的。
我的情况是,我正在编写一个需要加载语言文件的移动应用程序。在开始时,我加载语言文件,并从语言文件中检索按钮和其他GUI元素的文本。
这对我来说真的很糟糕。因为如果语言文件丢失,GUI就不应该出现。那么我该如何解决呢?把我所有的代码都放在success
回调中?对我来说,这似乎不是一个好的编码实践。我能用另一种方法解决它吗?
解决方案是手动添加覆盖以防止用户与界面交互,然后在AJAX查询完成后将其删除。
$(function() {
show_overlay();
$.ajax({
// Query to server
}).done(function() {
// Verify good data
// Do stuff
remove_overlay();
});
});
我阅读了票据中关于该参数弃用的官方讨论,我的理解如下:
-
问题是为同步AJAX实现Promises(1)会给它们带来开销。
-
在现实世界中有很多同步AJAX的用例,例如在页面卸载之前保留状态。因此,此功能将保留,但您使用它的方式可能会改变。
-
当
async
为false
时,最接近的解决方案(在1.8?中着陆)是仅支持回调(但不支持Promises)。
总结:如果必须的话,继续使用async: false
,但要注意它的缺点(阻塞VM)。别担心,如果这个功能从$.ajax()
中删除,我们将为您提供一个替代方案。
我敢打赌,在等待AJAX调用时,这1000个页面中的许多页面实际上并没有阻塞UI。相反,他们可能会在调用时用等待屏幕来模糊UI,然后在响应处理程序中删除它。
有很多方法可以模糊UI(您甚至可以使用设置为Modal的jQueryUIDialog,它没有转义或关闭按钮),所以我将由您决定。但代码的布局是这样的:
var someFunction = function () {
// any pre-conditions to the logic
// obscure the UI here
$.ajax({
url: 'ajax/test.html',
success: function(data) {
// handle the response
// show the UI again
},
error: function(data) {
// handle the response
// show the UI again
}
});
}
我相信有多种方法可以实现事件的顺序,但这只是一般的想法。阻止UI从来都不是真正的意图,我想jQuery要包含这个功能比删除更困难。它是异步的。
简单的解决方案是在ajax调用成功时将函数作为回调调用,并传递ajax调用的结果。
例如:
function getPetInfo(petid,callback){
$.ajax({
url: 'get-petinfo.php',
type: 'GET',
async: false,
data: {
cache: false,
petid: petid
},
success: function(data) {
var dataobject = JSON.parse(data);
callback(dataobject);
}
});
}
为什么要使用ajax来获取此文件?只需使用script
标签即可。
在任何情况下,您都不会将所有代码放在onSuccess中,而是从那里调用一个函数来启动代码运行。