问题描述

我已经在谷歌搜索这个,并在我的错误修复列表中避免这个错误现在很多时间,但我终于到达了列表的最后,我最后要使一个函数返回 true /false 来表示是否验证是否成功。

我正在使用 ajax 将某些字段与已经在 db 中的字段进行比较,默认情况下,$.post()方法是异步操作的。

我在调用 onSuccess 中设置一个变量,调用方法没有得到响应,所以我的所有 js /jquery 在 pageLoad 上失败… 我更喜欢如果我仍然可以继续使用 $.post 方法。

最佳解决方案

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,解决方案有所不同。

现在的想法是,由于现在 jQuery 不会阻止 UI,要么使用插件 (例如 BlockUI),要么在调用 $.ajax()之前手动添加一个叠加层,而是从 AJAX .done()回调中删除它。

请查看 this answer 以获得可能的实现。

次佳解决方案

如果要同步请求,将 async 属性设置为 false 作为请求。查看 jQuery AJAX Doc

第三种解决方案

从 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 是唯一可以设置异步性的请求类型

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛