我有一个jQuery .ajax调用:
$j.ajax({
type: "POST",
url: "/Services/Cart.asmx/UpdateQuantity",
data: data,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
var d = msg.d;
// etc.
},
error: function(xhr, msg) {
var response = JSON.parse(xhr.responseText);
var cart = $j('#cart');
if (response.Message) {
cart.before('<div class="error">' + response.Message + '</div>');
} else {
cart.before(' <div class="error">An unexpected error occurred.</div> ');
}
},
complete: function(request, settings) {
// Some other stuff.
}
}); // end ajax
alert('Initially thought this would be called after above .ajax call complete. But it is not. Rather, it is called before success etc.');
但是,根据第一次ajax调用返回的一些数据,我想发起第二次.ajax调用。看来,由于回调是如何为第一个回调配置的,它不是顺序发生的(即上面的最后一个警报('最初......')行的位置)所以我无法使用最新更新的客户端DOM数据。
如何最好发送另一个.ajax电话?我在整个活动中很快做了一些测试,但这似乎不是一件好事。
我有“jQuery in Action”坐在这里等着我抽出时间深入了解它,了解更多关于幕后发生的事情,但还没有时间!
更新:Erk。当明显没有按预期工作时,问题通常在于椅子和监视器之间;我会把这个放到一个全明星的大脑屁上。原来我最初设置它的方式(在成功回调中调用第二个.ajax调用)非常明显是正确的,但是我的第二个.ajax调用中有一个小的语法错误(因此失败并且发送错误的方式)。
并且@kgiannakakis被注意到答案,因为他/她是a)首先和b)提供了滑稽的低调“你可以将呼叫配置为同步,但这不是推荐的技术。”
答案 0 :(得分:3)
如果你想根据第一个结果发出另一个ajax请求,你可能应该在另一个函数中有第二个ajax请求。其他函数将在hte first ajax request的成功事件中被调用。 像这样的东西,虽然我没有测试这个以确保它是正确的:
$j.ajax({
type: "POST",
url: "/Services/Cart.asmx/UpdateQuantity",
data: data,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: newSuccessFunction(xhr,msg),
error: function(xhr, msg) {
var response = JSON.parse(xhr.responseText);
var cart = $j('#cart');
if (response.Message) {
cart.before(' <div class="error">' + response.Message + '</div> ');
}
else {
cart.before(' <div class="error">An unexpected error occurred.</div> ');
}
},
complete: function(request, settings) {
// Some other stuff.
}
}); // end ajax
function newSuccessFunction(xhr,msg) {
var d = msg.d;
//... etc.
$.ajax({ //...
});
alert('Initially thought this would be called after above .ajax call complete. But it is not. Rather, it is called before success etc.')
}
答案 1 :(得分:2)
警报应该在成功回调中进行,而不是在ajax调用之后。 ajax调用的默认行为是异步的。也就是说,调用立即返回,并且稍后在实际接收数据的某个时刻调用回调。
您可以将呼叫配置为同步,但这不是推荐的技术。