jQuery.ajax()方法的asynchronous选项已被弃用,现在呢?
从jQuery 1.8开始, jQuery.ajax()中使用 async:false
是不推荐使用的 。
但是,在后台有一个正在进行的AJAX通信的情况下,您看到了多less个带有“加载屏幕”的网页? 我可能看过数以千计的人。
我的情况是,我正在写一个需要加载语言文件的移动应用程序。 在开始时我加载语言文件,并从语言文件中检索button和其他GUI元素的文本。
这对我来说真的很糟糕。 因为如果语言文件丢失,GUI不应该出现。 那我该如何解决呢? 把我所有的代码在success
callback? 对我来说这不是一个好的编程习惯。 我能以另一种方式解决吗?
解决scheme是手动添加一个覆盖,以防止用户与界面交互,然后删除它,一旦AJAX查询完成。
$(function() { show_overlay(); $.ajax({ // Query to server }).done(function() { // Verify good data // Do stuff remove_overlay(); }); });
我读了关于这个参数不赞成的正式讨论 ,这里是我的理解:
-
问题是实现承诺 ( 1 )同步AJAX给他们的开销。
-
同步AJAX有很多现实世界的用例,例如在页面卸载之前保存状态。 因此,此function将保留,但您使用它的方式可能会改变。
-
最近的解决scheme(登陆1.8?)是只支持callback(但不是承诺),当
async
是false
。
总结 :如果需要,请继续使用async: false
,但要注意其缺点(阻塞VM)。 不用担心,如果此function被$.ajax()
移除,您将被提供一个替代scheme。
我敢打赌,在等待AJAX调用的时候,这1000个页面中的很多页面并没有实际阻止UI。 相反,他们可能会在调用时候等待屏幕来隐藏UI,然后在响应处理程序中删除它。
有很多方法来隐藏UI(你甚至可以使用设置为Modal的jQuery UI对话框,并且没有退出或closuresbutton),所以我将把这个决定留给你。 但是代码的布局是这样的:
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 } }); }
我相信有多种方式可以实现这种顺序的事件,但这是一般的想法。 阻止用户界面从来没有真正的意图,我想这是一个jQuery更加困难的决定, 包括该function比它是要删除它。 它意味着是asynchronous的。
你为什么要用ajax来获取这个文件? 只需使用script
标签包含它即可。
在任何情况下,你都不会把所有的代码放在onSuccess中,而是从那里调用一个单独的函数来启动你的代码的运行。