我已经回顾了有关如何使用延期编写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.
});