协慌网

登录 贡献 社区

如何让 jQuery 执行同步而非异步的 Ajax 请求?

我有一个 JavaScript 小部件,它提供标准的扩展点。其中之一是beforecreate函数。它应返回false以防止创建项目。

我使用 jQuery 在这个函数中添加了一个 Ajax 调用:

beforecreate: function (node, targetNode, type, to) {
  jQuery.get('http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value),

  function (result) {
    if (result.isOk == false) 
        alert(result.message);
  });
}

但我想阻止我的小部件创建项目,所以我应该在母函数中返回false ,而不是在回调中。有没有办法使用 jQuery 或任何其他浏览器中的 API 执行同步 AJAX 请求?

答案

jQuery 文档 :您将异步选项指定为false以获取同步 Ajax 请求。然后你的回调可以在你的母亲功能进行之前设置一些数据。

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

beforecreate: function (node, targetNode, type, to) {
    jQuery.ajax({
        url: 'http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value),
        success: function (result) {
            if (result.isOk == false) alert(result.message);
        },
        async: false
    });
}

您可以通过调用将 jQuery 的 Ajax 设置置于同步模式

jQuery.ajaxSetup({async:false});

然后使用jQuery.get( ... );执行 Ajax 调用jQuery.get( ... );

然后再打开一次

jQuery.ajaxSetup({async:true});

我想这与 @Adam 建议的相同,但对于那些想要将jQuery.get()jQuery.post()重新配置为更精细的jQuery.ajax()语法的人来说,它可能会有所帮助。

优秀解决方案我注意到当我尝试实现它时,如果我在 success 子句中返回一个值,它就会返回 undefined。我必须将它存储在变量中并返回该变量。这是我提出的方法:

function getWhatever() {
  // strUrl is whatever URL you need to call
  var strUrl = "", strReturn = "";

  jQuery.ajax({
    url: strUrl,
    success: function(html) {
      strReturn = html;
    },
    async:false
  });

  return strReturn;
}