如何设置jQuery推迟了AJAX调用



我已经回顾了有关如何使用延期编写ajax调用的许多讨论。不知何故,我只是没有得到我需要做的事情。例如,我在这里简化了我的代码。基本上,我有一个带有一些按钮的表格。单击它们有时会启动AJAX调用以在我的服务器上记录数据。(有时它会启动几个电话(

问题是,有时我的PHP代码在第一个呼叫完成之前会执行第二个呼叫。因此,我知道我需要等到我从通话#1获得响应后才发出电话2。我有很多按钮和组合可以进行Ajax调用。一个巨大的嵌套块是不可行的。

所以我想我需要使用.deferred((对象。我只是不确定如何设置它。所有以前的堆叠式响应似乎都不适用于我的情况,在我的情况下,对我的Ajax功能的调用可能来自各种不同的地方。

我只想要一个内部队列,只需等到一个Ajax调用完成后才执行下一个。

这是我的代码:

<html>
<head>
  <script src="jquery.min.js?x=1"></script>
</head>
<body>
<button type="button" id="btn1">Send Ajax 1</button>
<button type="button" id="btn2">Send Ajax 2</button>
<script>
  $("#btn1").click(function(){ send_ajax(1); });
  $("#btn2").click(function(){ send_ajax(2); }); 
  function send_ajax(val){
     var param="param="+val;
    var url = 'save_some_data.php';
    $.ajax({method: "GET", url: url, data: param});   
  }
</script>
</body>
</html>

基本问题是,如果我在快速连续中单击#btn1和#btn2,我希望我的代码等待#btn1的响应,直到它发送#btn2的ajax呼叫。 << << <</p>

好吧,我已经更新了我的代码,它几乎有效。前两次点击效果很好。但是第三次点击时会被绊倒。看起来以前的普罗米斯作为对象而不是true/false返回。我该如何使其返回布尔值?

<html>
<head>
  <script src="jquery.min.js?x=1"></script>
</head>
<body>
<button type="button" id="btn1">Send Ajax 1</button>
<button type="button" id="btn2">Send Ajax 2</button>
<script>
var previousPromise=false;
  $("#btn1").click(function(){ handler(1); });
  $("#btn2").click(function(){ handler(2); }); 
  function handler(val){
      if (previousPromise) {
        // Even if the previous request has finished, this will work.
        previousPromise = previousPromise.then(function () {
          return actualSender(val);
        });
        return previousPromise;
      }
      // first time
      previousPromise = actualSender(val);
      return previousPromise;     
  }
  function actualSender(val){
     var param="param="+val;
    var url = 'save_data.php';
    return($.ajax({method: "GET", url: url, data: param}));
  }
</script>
</body>
</html>

我认为您需要 async:false 在第一个请求之前不执行第二个请求。

$.ajax({
    method: "GET", 
    url: url, 
    data: param,
    async: false,   <--- Add this and try again.
});   

最新更新