如何从jQuery ajax成功处理程序中取消所有后续成功回调?

时间:2011-09-14 20:18:51

标签: jquery ajax event-handling

我正在使用jQuery 1.5.2并且在Ajax请求中注册了多个成功回调。在第一次成功回调中,我需要检查响应是否包含我需要的所有数据,如果没有则取消所有后续成功回调。

注意: 我无法访问服务器发送的标头。它始终发送200 Success

第二个注意: 我不能只合并两个回调。这是一个问题的简化示例,我在一个更大的系统中注册了代码中不同位置的回调。

如何取消后续成功回调?

一些示例代码如下所示(jsfiddle):

var request = $.ajax({
    url: '/echo/json'
});

// First success handler
request.done(function(data, textStatus, jqXHR) {
    console.log('first', jqXHR);
    if ($.isEmptyObject(data)) {
        // I want to cancel the second success handler here!

    }
});

// Second success handler
request.done(function(data, textStatus, jqXHR) {
    console.log('second', jqXHR);
});

谢谢!

2 个答案:

答案 0 :(得分:0)

刚刚合并。

// Success handler
request.done(function(data, textStatus, jqXHR) {
    console.log('first', jqXHR);
    if ($.isEmptyObject(data)) {
        return;
    }
    else {
        console.log('second', jqXHR);
    }
});

或试试这个:

var request = $.ajax({
    url: '/echo/json'
});
second = true;
// First success handler
request.done(function(data, textStatus, jqXHR) {
    console.log('first', jqXHR);
    if ($.isEmptyObject(data)) {
        second = false;
    }
});

// Second success handler
request.done(function(data, textStatus, jqXHR) {
    if(second)
        console.log('second', jqXHR);
});

小提琴:http://jsfiddle.net/maniator/zGvPW/3/

答案 1 :(得分:0)

在你的回调函数中,你应该做的第一件事就是检查一个状态变量(或'flag'),它会在给定当前情况的情况下通知函数它是否可以执行。

不希望回调再次执行?将标志设置为某个值,如果该标志在执行时具有该特定值,则让回调函数立即返回。

或者您可以决定只运行XX回调而不是暂停,或者只是暂停它们。

如果您设置这样的系统,您可以从一个地方控制具有多个异步回调的大型Web应用程序的行为,它将为您提供很多灵活性和选项。

为了帮助您,您可以拥有充当调度员的功能。每次要更改回调的行为时,此函数将用作回调函数。您将传递正常的回调函数作为参数调用,然后调度程序将在决定是否继续正常回调之前检查正确的条件。

这样您就不需要在回调函数内部检查条件。它对于具有很多回调的大型应用程序特别有用。