如何/是不是重写 async:false AJAX 函数?

Posted

技术标签:

【中文标题】如何/是不是重写 async:false AJAX 函数?【英文标题】:How/Whether to rewrite async:false AJAX function?如何/是否重写 async:false AJAX 函数? 【发布时间】:2016-04-03 17:52:07 【问题描述】:

我正在使用带有 async:false 的 AJAX 调用来返回数据,如下所示:

var my_data = my_function(10, 20);

function my_function(value1, value2) 
    var returnData;
    $.ajax(
      type: 'POST',
      url: 'my_function.php',
      data:  variable1: value1, variable2: value2 ,
      success: function(data)  returnData = data; ,
      async:false
    );
    return returnData;
;

请注意,我已设置 async:false,这在我的代码上下文中是必需的,并且可以完美运行。

但是,在 JQuery API 中,此消息是为异步条目提供的:

从 jQuery 1.8 开始,使用 async: false 和 jqXHR ($.Deferred) 是 已弃用;您必须使用成功/错误/完成回调选项 而不是jqXHR对象的相应方法如 jqXHR.done() 或已弃用的 jqXHR.success()。

我无法理解关于我的功能的警告,因为我没有在日常工作中使用$.Deferred;警告仍然可能以我不欣赏的方式适用。那么,将代码保持原样是否安全,或者是否应该根据 async 的弃用来重写它,如果是,应该如何重写? (我需要同步执行的功能。)

非常感谢!

【问题讨论】:

为什么需要使用同步请求? 如果您希望继续使用同步请求,可以使用原生 Js Ajax 请求(使用 XMLHttpRequest)代替 jQuery 的请求。 它不仅在 jQuery 中被弃用,它也是 deprecated in the specification(在 webworkers 之外)。 Chrome 至少已经显示警告,不确定其他浏览器。预计它会在某个时候停止工作 - 我不会在任何新代码中使用它。 如果您使用 async: false 作为一种方法来确保您的 ajax 在执行其他操作之前完成,您可以使用 Promise 来实现您的目标。 我很惊讶没有人对这个问题提供有效的答案。这个问题很简单。 【参考方案1】:

您提供的代码看起来不错。以下是被弃用的版本(不要这样做):

var my_data = my_function(10, 20);

function my_function(value1, value2) 
    var returnData;
    $.ajax(
      type: 'POST',
      url: 'my_function.php',
      data:  variable1: value1, variable2: value2 ,
      async:false
    ).success(function(data)  returnData = data; );
   return returnData;
;

【讨论】:

以上是关于如何/是不是重写 async:false AJAX 函数?的主要内容,如果未能解决你的问题,请参考以下文章

$.ajax、async:false 和 IE 9+

如何设置jquery的ajax方法为同步

jQuery.ajax() 中的 "async: false" 做了啥?

Ajax请求中的async:false/true的作用

如何将Ajax请求从异步改为同步

ajax参数async:false/true的作用