关于javascript:如何使jquery“$ .post”请求同步

how to make a jquery “$.post” request synchronous

本问题已经有最佳答案,请猛点这里访问。

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

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

我在调用onSuccess中设置了一个变量,调用方法由于这个原因没有得到响应,所以我所有的js/jquery在pageload上都失败了…如果我能继续使用$.post方法,我会更愿意。


jQuery<1.8

我建议您使用$.ajax()而不是$.post(),因为它更易于定制。

如果您打电话给$.post(),例如:

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

你可以把它变成它的$.ajax()等价物:

1
2
3
4
5
6
7
8
$.ajax({
  type: 'POST',
  url: url,
  data: data,
  success: success,
  dataType: dataType,
  async:false
});

请注意$.ajax()参数对象末尾的async:false

这里您有一个完整的$.ajax()参数详细信息:jquery.ajax()–jquery api文档。

jquery>=1.8"async:false"折旧通知

jquery>=1.8不会在HTTP请求期间阻塞UI,因此我们必须使用变通方法来停止用户交互,只要请求被处理。例如:

  • 使用插件,如blockui;
  • 在调用$.ajax()之前手动添加一个覆盖,然后在调用ajax .done()回调时删除它。

请以这个答案为例。


如果需要同步请求,请将该请求的async属性设置为false。查看jquery ajax文档


从jquerydocs:您将async选项指定为false以获取同步Ajax请求。然后您的回调可以在您的母亲函数继续之前设置一些数据。

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

1
2
3
4
5
6
7
8
9
10
beforecreate: function(node,targetNode,type,to) {
    jQuery.ajax({
         url:    url,
         success: function(result) {
                      if(result.isOk == false)
                          alert(result.message);
                  },
         async:   false
    });          
}

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