Jquery ajax()方法';s异步选项已弃用,现在怎么办?

Jquery ajax()方法';s异步选项已弃用,现在怎么办?,jquery,ajax,mobile,Jquery,Ajax,Mobile,从jQuery1.8开始,中的async:false已被弃用了 但是,当在后台进行AJAX通信时,您看到了多少带有“加载屏幕”的网页?我可能见过成千上万的 我的情况是,我正在编写一个需要加载语言文件的移动应用程序。在开始时,我加载语言文件,从语言文件中检索按钮和其他GUI元素的文本 这对我来说真的很糟糕。因为如果语言文件丢失,GUI就不会出现。那我怎么解决呢?是否将所有代码放入success回调?对我来说,这似乎不是一个好的编码实践。我可以用另一种方法解决吗?为什么要使用ajax获取此文件?只需

从jQuery1.8开始,中的
async:false
已被弃用
但是,当在后台进行AJAX通信时,您看到了多少带有“加载屏幕”的网页?我可能见过成千上万的

我的情况是,我正在编写一个需要加载语言文件的移动应用程序。在开始时,我加载语言文件,从语言文件中检索按钮和其他GUI元素的文本


这对我来说真的很糟糕。因为如果语言文件丢失,GUI就不会出现。那我怎么解决呢?是否将所有代码放入
success
回调?对我来说,这似乎不是一个好的编码实践。我可以用另一种方法解决吗?

为什么要使用ajax获取此文件?只需使用
脚本
标记将其包括在内


在任何情况下,您都不会将所有代码放在onSuccess中,而是从那里调用一个函数来启动代码的运行。

解决方案是手动添加覆盖以防止用户与界面交互,然后在AJAX查询完成后将其删除

$(function() {
    show_overlay();        

    $.ajax({
        // Query to server
    }).done(function() {
        // Verify good data
        // Do stuff
        remove_overlay();
    });
});
我敢打赌,在等待AJAX调用时,这1000个页面中的许多实际上并没有阻塞UI。相反,它们可能在调用时用等待屏幕掩盖UI,然后在响应处理程序上删除该屏幕

有很多方法可以模糊UI(您甚至可以使用设置为模态的jQueryUI对话框,并且没有转义或关闭按钮),所以我将把这个决定留给您。但是代码的布局应该是这样的:

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包含该特性比删除该特性更加困难。这意味着它是异步的。

我在票据中读到了关于此参数弃用的信息,以下是我的理解:

  • 问题是为syncajax实现s()会给它们带来开销

  • syncajax在现实世界中有很多用例,例如在页面卸载之前保存状态。因此,此功能将保留,但您使用它的方式可能会改变

  • async
    false
    时,最接近的解决方案(登录到1.8?)是只支持回调(但不支持承诺)


总结:如果必须,请继续使用
async:false
,但要注意它的缺点(阻塞VM)。别担心,如果从表单中删除此功能,您将获得一个替代方案。

您可以创建新功能。并在onSuccess处理程序中调用这些函数。它仍然可以查看,好像同步功能不受欢迎吗?@ChenKinnrot
async=false
is`sync;)我读了几遍才点击那个。起初我喜欢“嗯?”然后我喜欢“ermahgerd!”,但是如果你真的想阻止UI,请使用blockUI插件:@Simon:当然,如果你真的想的话。但这并不被推荐,而且往往表明人们需要重新思考自己的方法。可能会有例外,但我现在想不出任何例外。“在页面卸载之前保留状态”是什么意思?我想不出同步AJAX有什么好的用途。@user2867288,页面卸载是一个事件,当用户试图关闭浏览器选项卡/窗口时就会发生。“保存状态”可能意味着很多事情:自动保存表单数据,告诉服务器用户交互已经完成,提交一些分析数据(例如用户在页面上花费了多少时间)。这真的有一个用例——这就是为什么要创建它。当它具有适当的交叉浏览器支持时,就不需要太多的同步AJAX了。您能解释一下我应该如何手动添加和删除该覆盖吗?show_overlay()不是函数。抱歉,如果这个问题太难回答,但我对这个问题还不熟悉。@RobertoSepúlvedaBravo这只是一个例子
show_overlay()
是一个假设函数,它显示一个模糊界面的元素,比如一个div,它用一个高z索引填充视口,其中包含一些内容。好的,请澄清一下。我正在尝试处理Jquery ContextMenu插件,根据ajax响应生成ContextMenu子项,因此我无法将您的解决方案应用于此。如果需要阻止ui的函数是一个ajax调用,比如从服务器抓取html并加载
$().html(数据)
?您可以添加一个“不可触及”的覆盖,而不是一个覆盖类,例如,
body.untouchable*{指针事件:none!important;游标:wait!important;}
。假设存在需要通过ajax获取数据的场景,这个问题仍然是值得考虑的。