53

从 jQuery 1.8 开始,不推荐使用jQuery.ajax()async:false中的。 但是,在后台正在进行 AJAX 通信的情况下,您见过多少带有“加载屏幕”的网页?我可能见过成千上万的人。

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

这对我来说真的很糟糕。因为如果缺少语言文件,则不应出现 GUI。那么我该如何解决呢?将我所有的代码放在success回调中?对我来说,这似乎不是一个好的编码实践。我可以用另一种方式解决吗?

4

4 回答 4

38

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

$(function() {
    show_overlay();        

    $.ajax({
        // Query to server
    }).done(function() {
        // Verify good data
        // Do stuff
        remove_overlay();
    });
});
于 2012-07-12T08:46:44.923 回答
30

我阅读了票中关于弃用此参数的官方讨论,这是我的理解:

  • 问题是为同步 AJAX实现Promise s ( 1 ) 会给它们带来开销。

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

  • 最接近的解决方案(登陆 1.8?)是在 is 时仅支持回调(但不支持 Promises asyncfalse

总结async: false如果必须,请继续使用,但要注意它的缺点(阻塞 VM)。不用担心,如果此功能从表单中删除,您将获得另一种选择$.ajax()

于 2012-08-01T08:19:06.257 回答
3

我敢打赌,在等待 AJAX 调用时,这 1000 个页面中的许多页面实际上并没有阻塞 UI。相反,他们可能会在调用时用等待屏幕掩盖 UI,然后在响应处理程序上将其删除。

有很多方法可以隐藏 UI(您甚至可以使用设置为 Modal 且没有转义或关闭按钮的 jQuery UI 对话框),所以我将由您决定。但是代码的布局是这样的:

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包含该功能比删除它更困难。它是异步的。

于 2012-07-12T08:49:04.553 回答
-1

为什么要使用 ajax 来获取这个文件?只需使用script标签包含它。

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

于 2012-07-12T08:46:38.407 回答