Ajax呼叫等待另一个Ajax呼叫的响应?
问题描述:
我有两个ajax调用不能在一个调用中完成。当第一个Ajax调用开始时,第二个Ajax调用可以立即开始,或者当用户按下发送按钮时。如果第二个Ajax调用开始,他必须等待第一个Ajax调用的响应,因为他需要来自它的数据。Ajax呼叫等待另一个Ajax呼叫的响应?
如何才能实现第二个Ajax调用只有在第一个Ajax调用的响应到达后才发送他的请求?
- 是否有另一种方法比setTimeout?
- 我可以以某种方式在ajax调用1上注册ajax调用2的监听器吗?
我的代码是:
var xhrUploadComplete = false;
// ajax call 1
$.ajax({
url: url,
type: "POST",
data: formdata,
processData: false,
contentType: false,
complete: function(response) {
var returnedResponse = JSON.parse(response.responseText);
xhrUploadComplete = true;
}
});
// ajax call 2
if (xhrUploadComplete) {
$.ajax({
url: url2,
type: "POST",
data: formdata2,
processData: false,
contentType: false,
complete: function(response) {
...
}
});
}
编辑:第二个AJAX调用不能在第一次调用的()完成或完成()上公布,因为这取决于用户的选择来发送最终形式。这两步过程的目的是在用户将其插入输入类型=文件后,将图像发送到服务器。
编辑:在知道我不能的if(..),因为这是一个异步调用。我写了它来明确我需要做什么。我想我需要Java中的未来。
答
xhrUploadComplete
将被设置为true
异步(在未来,当请求已完成),所以您的if
-condition(即评估的请求启动后右)将永远不会实现。你不能简单地return
(or set) a value from an ajax call。相反,移动是等待结果到处理程序会设置代码/返回的变量:
$.ajax({
url: url,
type: "POST",
data: formdata,
processData: false,
contentType: false,
complete: function(response) {
var returnedResponse = JSON.parse(response.responseText);
$.ajax({
url: url2,
type: "POST",
data: formdata2,
processData: false,
contentType: false,
complete: function(response) {
…
}
});
}
});
随着无极模式,你甚至可以更优雅的撰写者:
$.ajax({
url: url,
type: "POST",
data: formdata,
processData: false,
contentType: false
}).then(function(response) {
var returnedResponse = JSON.parse(response.responseText);
return $.ajax({
url: url2,
type: "POST",
data: formdata2,
processData: false,
contentType: false
});
}).done(function(response) {
// result of the last request
…
}, function(error) {
// either of them failed
});
也许你需要也需要这个:
var ajax1 = $.ajax({
url: url, …
}).then(function(response) {
return JSON.parse(response.responseText);
});
$(user).on("decision", function(e) { // whatever :-)
// as soon as ajax1 will be or has already finished
ajax1.then(function(response1) {
// schedule ajax2
return $.ajax({
url: url2, …
})
}).done(function(response) {
// result of the last request
…
}, function(error) {
// either of them failed
});
});
难道你不是已经注册了第一个Ajax调用的结果的监听器吗?请告诉我们你的代码。 – Bergi
@Bergi我发布了代码 – confile
“如果第二个Ajax调用启动,他必须等待第一个Ajax的响应=>这没有任何意义,如果它必须等待,那么它不能启动... – Christophe