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



从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的用例,例如在页面卸载之前保留状态。因此,此功能将保留,但您使用它的方式可能会改变。

  • asyncfalse时,最接近的解决方案(在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中,而是从那里调用一个函数来启动代码运行。

最新更新