如何取消jQueryAjax成功处理程序的所有后续成功回调?

如何取消jQueryAjax成功处理程序的所有后续成功回调?,jquery,ajax,event-handling,Jquery,Ajax,Event Handling,我使用的是jQuery1.5.2,在Ajax请求中注册了多个成功回调。在第一次成功回调中,我需要检查响应是否包含我需要的所有数据,如果没有,则取消所有后续成功回调 注意:我无权访问服务器发送的标题。它总是发送一个200成功 第二个注意:我不能将这两个回调组合起来。这是一个简化的例子,说明了一个较大的系统在代码中的不同位置注册回调时遇到的问题 如何取消后续的成功回调? 一些示例代码如下所示(): 谢谢大家! 只需合并 // Success handler request.done(function

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

注意:我无权访问服务器发送的标题。它总是发送一个
200成功

第二个注意:我不能将这两个回调组合起来。这是一个简化的例子,说明了一个较大的系统在代码中的不同位置注册回调时遇到的问题

如何取消后续的成功回调?

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

谢谢大家!

只需合并

// 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);
});

Fiddle:

在回调函数中,您应该做的第一件事是检查状态变量(或“flag”),根据当前情况,它将通知函数是否可以执行

不想再执行回调了吗?将该标志设置为某个值,并让回调函数在执行该标志时立即返回该特定值

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

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

为了帮助您做到这一点,您可以使用一个充当调度器的函数。每当您想要更改回调行为时,此函数将用作回调函数。您将传递普通回调函数作为参数进行调用,然后调度器将在决定是否继续正常回调之前检查正确的条件


这样,您就不需要检查回调函数内部的条件。这对于具有大量回调的大型应用程序尤其有用。

我正在查看jQuery代码,但我真的看不到实现这一点的方法。为什么它们被分成两个呼叫?这里有多个回调有什么意义?为什么不将函数集成到第一个回调方法本身中呢?这是一个具有多个回调的更复杂系统的简化示例。使用“或尝试此”解决方案,但将标志添加到jqXHR对象中。在第一个成功处理程序中,我使用了
jqXHR.failed=true
,在第二个成功处理程序中,我使用了
if(!jqXHR.failed)
()。。。通常你会选择给你答案的答案。。。。这实际上对未来的用户很有帮助。你因为提供了更多的信息而获得了答案。谢谢
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);
});