jQuery.ajax() 方法的异步选项已弃用,现在怎么办?

Posted

技术标签:

【中文标题】jQuery.ajax() 方法的异步选项已弃用,现在怎么办?【英文标题】:jQuery.ajax() method's async option deprecated, what now? 【发布时间】:2012-07-12 08:40:07 【问题描述】:

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

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

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

【问题讨论】:

您可以制作新功能。并在 onSuccess 处理程序中调用这些函数。它仍然可以这样查看 @ChenKinnrot async=false is `sync ;) 我读了几遍才点击它。一开始我的反应是“嗯?”然后我就像“ermahgerd!” 【参考方案1】:

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

$(function() 
    show_overlay();        

    $.ajax(
        // Query to server
    ).done(function() 
        // Verify good data
        // Do stuff
        remove_overlay();
    );
);

【讨论】:

您能解释一下我应该如何手动添加和删除该叠加层吗? show_overlay() 不是函数。对不起,如果这个问题太菜鸟,但我是新手。 @RobertoSepúlvedaBravo 这只是一个例子。 show_overlay() 是一个假设函数,它显示一个隐藏界面的元素,例如一个 div,它用高 z-index 填充视口并包含一些内容。 好的,请您澄清一下。我正在尝试处理 Jquery ContextMenu 插件,根据 ajax 响应生成 contextmenu 子项,因此我无法将您的解决方案应用于此。 如果需要阻止 ui 的函数是一个 ajax 调用,例如从服务器抓取 html 并使用 $().html(data) 加载它呢? 您可以向 body 元素添加一个“不可触摸”类,而不是覆盖,例如body.untouchable *pointer-events:none !important; cursor: wait !important;.【参考方案2】:

我在工单中阅读了关于弃用此参数的official discussion,这是我的理解:

问题在于,为同步 AJAX 实现 Promises (1) 会给它们带来开销。

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

asyncfalse 时,最接近的解决方案(登陆1.8?)是只支持回调(但不支持Promises)。

总结:如果需要,请继续使用async: false,但要注意它的缺点(阻塞虚拟机)。不用担心,如果此功能从 $.ajax() 中删除,您将获得替代方案。

【讨论】:

“在页面卸载前保留状态”是什么意思?我想不出同步 AJAX 有什么好的用途。 @user2867288,页面卸载是一个事件,当用户尝试关闭浏览器选项卡/窗口时发生。 “保持状态”可能意味着很多事情:自动保存表单数据,告诉服务器用户交互已经完成,提交一些分析数据(例如用户在页面上花费了多少时间)。这确实有一个用例 - 这就是创建 Beacon API 的原因。当它具有适当的跨浏览器支持时,就不需要同步 AJAX。【参考方案3】:

我敢打赌,这 1000 个页面中的 许多 在等待 AJAX 调用时实际上并没有阻塞 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 决定 包含 这个功能比 删除 它更难。它是异步的。

【讨论】:

但是如果你真的想阻止 UI 使用 blockUI 插件:jquery.malsup.com/block @Simon:当然,如果你真的想要的话。但不建议这样做,而且通常情况下,这表明人们需要重新考虑自己的方法。可能有例外,虽然我现在想不出来。【参考方案4】:

为什么要使用 ajax 来获取这个文件?只需使用 script 标记将其包含在内。

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

【讨论】:

想象在某些情况下您需要通过 ajax 获取数据,这个问题仍然值得尊敬。

以上是关于jQuery.ajax() 方法的异步选项已弃用,现在怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

以下项目选项已弃用,并已删除:

WINSOCK2 WSAAsyncSelect 已弃用问题

Google Cloud Datastore备份 - 已弃用?

jQuery AJAX 方法

PythonQt 是不是已弃用?

load() 方法已弃用?