如何基于初始.ajax调用的结果启动另一个jQuery .ajax调用?

时间:2009-03-20 07:09:27

标签: jquery ajax

我有一个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)提供了滑稽的低调“你可以将呼叫配置为同步,但这不是推荐的技术。”

2 个答案:

答案 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调用的默认行为是异步的。也就是说,调用立即返回,并且稍后在实际接收数据的某个时刻调用回调。

您可以将呼叫配置为同步,但这不是推荐的技术。