如何使 jQuery 的 "$.post" 请求同步

182

我已经搜索了很长一段时间并避免了这个错误出现在我的错误修复列表中,但最终我到达了列表的末尾,其中我必须使一个函数返回true/false来说明验证是否成功。

我正在使用ajax来将某些字段与已经存在于数据库中的字段进行比较,而默认情况下$.post()方法会异步执行它的操作。

我正在onSuccess调用中设置一个变量,但由于这个原因,调用方法没有得到响应,因此我的所有js/jquery都无法在页面加载时运行... 我希望仍然可以继续使用$.post方法。


啊,你需要添加一段代码示例来澄清这个问题。 - Femi
4
不要这样做,否则会导致浏览器冻结,直到服务器回复。 - SLaks
1
@Neal,这个问题独特的原因是因为jQuery有多种调用服务器页面的方式,而我特别想知道如何使$.post请求同步,而不仅仅是一个jQuery ajax请求。 - pythonian29033
3个回答

226

jQuery < 1.8

我建议您使用$.ajax()代替$.post(),因为它更加可定制。

如果您正在调用$.post(),例如:

$.post( url, data, success, dataType );

您可以将其转换为$.ajax()的等价形式:

$.ajax({
  type: 'POST',
  url: url,
  data: data,
  success: success,
  dataType: dataType,
  async:false
});
请注意,在$.ajax()参数对象的末尾加上async:false
以下是$.ajax()参数的详细说明:jQuery.ajax() – jQuery API Documentation

jQuery >=1.8 "async:false"已弃用警告

jQuery >=1.8不会在http请求期间阻止用户界面,因此我们必须使用解决方法来停止用户交互,直到请求处理完毕。例如:

  • 使用插件,例如BlockUI
  • 在调用$.ajax()之前手动添加覆盖层,然后在调用AJAX .done()回调时将其删除。
请查看这个答案以获取示例。

18
如果您想进行同步请求,请将请求的 async 属性设置为 false。请查看 jQuery AJAX 文档

7

根据Jquery文档,您可以将async选项设置为false以获取同步的Ajax请求。然后,您的回调函数可以在主函数继续之前设置一些数据。

如果按照建议更改代码,您的代码将如下所示:

beforecreate: function(node,targetNode,type,to) {
    jQuery.ajax({
         url:    url,
         success: function(result) {
                      if(result.isOk == false)
                          alert(result.message);
                  },
         async:   false
    });          
}

这是因为 $.ajax 是唯一可以设置异步的请求类型。

1
这个答案似乎是 这个 答案的复制。 - user3714134
2
@HugoZink 它肯定是抄袭的,但我们俩的答案都是从 jQuery 文档中抄来的 :-D - pythonian29033

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接