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

IT技术 javascript jquery ajax asynchronous
2021-01-25 22:56:49

我有一个提供标准扩展点的 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 请求?

6个回答

来自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
    });
}
@SLA80 不。从 jQuery 1.1 开始:stackoverflow.com/questions/6849686/...
2021-03-29 22:56:49
确切地说,同步调用不可能使用 get()、post()、load()。只有 ajax() 有 "async" 参数,可以设置为 "false"。
2021-04-07 22:56:49

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

jQuery.ajaxSetup({async:false});

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

然后只需再次打开它一次

jQuery.ajaxSetup({async:true});

我想它的效果与@Adam 的建议相同,但它可能对想要重新配置其语法jQuery.get()jQuery.post()更复杂的jQuery.ajax()语法的人有所帮助

优秀的解决方案!我注意到当我尝试实现它时,如果我在成功子句中返回一个值,它会以未定义的形式返回。我必须将它存储在一个变量中并返回该变量。这是我想出的方法:

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;
}
这是一个同步调用 (async:false)。
2021-03-17 22:56:49

所有这些答案都忽略了使用 async:false 进行 Ajax 调用将导致浏览器挂起直到 Ajax 请求完成这一点。使用流控库就可以解决这个问题,不用挂断浏览器。这是Frame.js的示例

beforecreate: function(node,targetNode,type,to) {

    Frame(function(next)){

        jQuery.get('http://example.com/catalog/create/', next);
    });

    Frame(function(next, response)){

        alert(response);
        next();
    });

    Frame.init();
}
function getURL(url){
    return $.ajax({
        type: "GET",
        url: url,
        cache: false,
        async: false
    }).responseText;
}


//example use
var msg=getURL("message.php");
alert(msg);