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

Posted

技术标签:

【中文标题】jQuery.ajax() 中的 "async: false" 做了啥?【英文标题】:What does "async: false" do in jQuery.ajax()?jQuery.ajax() 中的 "async: false" 做了什么? 【发布时间】:2010-12-01 11:41:52 【问题描述】:

具体来说,它与默认值 (async: true) 有何不同?

在什么情况下我想将async显式设置为false,这是否与阻止页面上的其他事件触发有关?

【问题讨论】:

看起来类似于这个问题:http://***.com/questions/133310/how-can-i-get-jquery-to-perform-a-synchronous-rather-than-asynchronous-ajax-req 使调用同步.... 是的,在我看来,如果它不是异步的,它应该被称为“Ajax”(异步 javascript 和 XML)以外的东西...... 异步意味着脚本会向服务器发送请求,并继续执行而不等待回复。一旦收到回复,就会触发浏览器事件,这反过来又允许脚本执行相关操作。 【参考方案1】:

有没有关系 防止页面上的其他事件 从射击?

是的。

将 async 设置为 false 意味着您正在调用的语句必须在函数中的下一条语句被调用之前完成。如果您设置 async: true 则该语句将开始执行,并且无论异步语句是否已完成都将调用下一条语句。

如需了解更多信息,请参阅: jQuery ajax success anonymous function scope

【讨论】:

我一直想知道这是如何实现的,因为 JavaScript 不是线程化的。 @L.DeLeo - 不,一点也不 - 延迟是管理异步函数调用复杂性的另一种方式 - async: false 完全消除了调用中的异步。对ajax blocks 的调用 - 在服务器响应之前不会执行其后面的代码。 请记住,这也意味着浏览器不会捕获/触发在执行 ajax 时发生的任何事件。我发现这一点很困难,试图弄清楚为什么 Firefox 没有触发点击事件。原来是因为“强制”模糊事件,随后的同步调用阻止了它。 @Matt 不,它不是(不再是^^)w3schools.com/html/html5_webworkers.asp 好像async: false已经死了,我试了一下,得到了18:17:49.384 Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user’s experience. For more help http://xhr.spec.whatwg.org/ 1 jquery.js:9061:4【参考方案2】: async:false = 代码暂停。 (其他代码等待完成。) async:true = 代码。 (没有任何暂停。其他代码不等待。)

就这么简单。

【讨论】:

【参考方案3】:

Async:False 将持有剩余代码的执行。一旦你得到 ajax 的响应,剩下的代码才会执行​​。

【讨论】:

【参考方案4】:

如果您禁用异步检索,您的脚本将一直阻塞,直到请求完成。尽管我发现异步回调更简洁,但它对于以已知顺序执行某些请求序列很有用。

【讨论】:

Joe:这取决于您在后台是否有任何工作线程。【参考方案5】:

将 async 设置为 false 意味着 ajax 请求之后的指令必须等待请求完成。下面是一种必须将 async 设置为 false 的情况,代码才能正常工作。

var phpData = (function get_php_data() 
  var php_data;
  $.ajax(
    url: "http://somesite/v1/api/get_php_data",
    async: false, 
    //very important: else php_data will be returned even before we get Json from the url
    dataType: 'json',
    success: function (json) 
      php_data = json;
    
  );
  return php_data;
)();

上面的例子清楚地解释了 async:false

的用法

通过将其设置为 false,我们确保一旦从 url 检索到数据,只有在 return php_data; 被调用

【讨论】:

以防万一其他人遇到与我相同的问题:此答案强调 return php_data 语句不能在成功函数中,但必须在 $.ajax() 函数之外。我将我的 return php_data 等价物放在 success: function() 中,它总是返回 undefined 您可以删除success 回调并将代码缩短为:var data = $.ajax(url: 'http://httpbin.org/get', async: false).responseText;【参考方案6】:

一个用例是在用户关闭窗口或离开页面之前调用ajax。这就像在用户导航到另一个站点或关闭浏览器之前删除数据库中的一些临时记录。

 $(window).unload(
        function()
            $.ajax(
            url: 'your url',
            global: false,
            type: 'POST',
            data: ,
            async: false, //blocks window close
            success: function() 
        );
    );

【讨论】:

没有多少 JavaScript 会阻止浏览器窗口关闭 我需要 async false 来处理完全不相关的事情,但它解决了我的问题,因为它允许我的脚本在将其填充到页面上之前从 xml 文件中获取一个未定义的值。【参考方案7】:

来自

https://xhr.spec.whatwg.org/#synchronous-flag

worker 之外的同步 XMLHttpRequest 正在从 Web 平台中移除,因为它会对最终用户的体验产生不利影响。 (这是一个需要很多年的漫长过程。)当 JavaScript 全局环境是文档环境时,开发人员不得为 async 参数传递 false。强烈建议用户代理在开发人员工具中警告此类使用,并且可能会尝试在发生 InvalidAccessError 异常时抛出异常。 未来的方向是在工作线程中只允许 XMLHttpRequests。该消息旨在就此发出警告。

【讨论】:

以上是关于jQuery.ajax() 中的 "async: false" 做了啥?的主要内容,如果未能解决你的问题,请参考以下文章

jquery ajax获取json文件数据在表格中显示

jquery(ajax)中的JS变量附加html标签

jquery ajax删除数据

在java中如果通过jquery ajax获得servlet中的response.getwrite.write(paystatus)的值

php+JQuery+Ajax简单实现页面异步刷新

img如何接收jquery ajax异步上传的动态图片