【问题标题】:Can you stop a defered callback in jquery 1.5?你能在 jquery 1.5 中停止延迟回调吗?
【发布时间】:2011-03-02 23:08:48
【问题描述】:

我想知道你有这样的东西

// Assign handlers immediately after making the request,
// and remember the jqxhr object for this request
var jqxhr = $.ajax({ url: "example.php" })
    .success(function(response) { alert("success"); })


// perform other work here ...

// Set another success function for the request above
jqxhr.success(function(response){ alert("second success"); });

所以我在想这个。我有一个通用函数,我想将它用于我的所有响应,这些响应将传递给我的成功。

这个函数基本上会检查服务器验证是否发现任何错误。如果是,他们会对其进行格式化并显示一条消息。

现在我想知道我是否可以使用第二个成功功能来做特定的事情。就像说一个ajax请求需要在表中添加一行。所以这应该是可能的。我只是做了上面的事情,在第二次成功中我只是添加了行。

是否有可能如果第一次成功运行并看到服务器存在验证错误,我可以阻止第二次成功发生吗?

有点

If(first success finds errors)
{
   // print out errors
   // don't continue onto next success
}
else
{
   // go to next success 
}

编辑

我发现有一些东西叫deferred.reject ,这确实停止了它,但我想知道如何指定只停止成功的那个。因为我的想法是,如果还有其他延迟的,比如完整的,它也会被拒绝吗?

【问题讨论】:

    标签: jquery jquery-1.5 jquery-deferred


    【解决方案1】:

    如果您只有一个验证检查功能,您可以创建自己的延迟并将处理程序附加到该功能,而不是直接连接到 ajax 请求。

    这个例子给出了一个单一级别的验证,如果你想把它们链接在一起,你可能需要一个不同的模式。

    var validated = function(jqxhr, validationFunction){
        var myDeferred = new $.Deferred();
        var doValidation = function(){
            var result = validationFunction.apply(this, arguments);
            if (result){
                myDeferred.resolve(arguments);
            }
            else
            {
                myDeferred.reject(arguments);
            }
        };
    
        jqxhr.success(doValidation);
        return myDeferred;
    };
    
    var jqxhr = $.ajax({ url: "/echo/json/"});
    var vtest = validated(jqxhr, function(response){
        //Do your validation check here,
        //return true if it passed, false if it failed.
        return false; 
    });
    
    //attach your handlers to vtest
    vtest.done(function(response){alert("yay");});
    vtest.fail(function(response){alert("drats");});
    

    【讨论】:

      【解决方案2】:

      当您的第一个成功函数评估来自 AJAX 调用的响应并确定它满足您的要求时,调用您的第二个成功函数

      示例:

      $.post('example.php', {name_1: value_1, name_2: value_2}, function(response){
        //this code gets executed when the AJAX request was successful
      
        //do some more stuff
      
        //check the response
        if(response == 'success'){
          second_success_function(response);
        }
      });
      

      此示例假设您在一切按计划进行时获得字符串“成功”。

      $.post 调用中的第二个参数是您传递给脚本的值的映射。这是可选的。

      您还可以指定一个处理程序,以便在所有 AJAX 请求完成后执行。

      http://api.jquery.com/ajaxStop/

      【讨论】:

        【解决方案3】:

        AFAIK 不,你不能像这样使用 deferred object从 jQuery v1.5 开始 .ajax() 对象扩展延迟对象)。

        当您向deferred object.success(..... 添加回调时,它们会堆叠在一起。只要您的延迟对象resolves当 ajax 成功完成)它就会运行所有堆叠的回调。然后尝试和reject 对象为时已晚,例如停止运行任何更多成功回调。 看看例子here

        最好在你的成功函数中执行你需要的逻辑并调用一个包装函数,该函数将处理任何重复的操作,如果你的逻辑测试通过,则从成功中调用它。


        根据 cmets 更新:

        var cs = true;
        var jqxhr = $.ajax({ 
            beforeSend: function(){
                cs=true;
            },
            url: "/echo/json/" 
        })
        
        .success(function(response) { 
            if(cs)
            alert("success"); 
        })
        
        .success(function(response) { 
            if(cs)
                cs = false;
                alert("success 2"); 
        })
        
        .success(function(response) { 
            if(cs)
                alert("success 3"); 
        });
        

        使用逻辑来终止回调。

        【讨论】:

        • 当我尝试拒绝它时,确实阻止了我的第二次成功运行。如果我理解正确,那么它可能起作用的原因是,在第一次成功中,拒绝是在哪里完成的,所以它在技术上还没有完成?
        • @Scobler- 我不明白拥有多个成功回调的意义。我想也许是这样,你可以做我想做的事情,但事实并非如此。
        • 不是真的,我的理解是,当你创建对象时,它会堆叠所有的回调(success)然后一旦对象完成(拒绝或解决已被调用) 然后它将处理堆栈。毕竟它们是回调,一旦对象完成它的事情就会执行一些事情 - 它们不会流动,即逐行。再看看这个 update。另一件事是,一旦对象收到解析的调用,我不认为它就意味着要更改或拒绝。
        • 实际上堆叠成功回调没有意义。它只是你可以做的。 jQuery 通过使.ajax() 成为延迟对象所实现的真正目的是允许您更公开地与对象交互。所以你可以使用.then() 而不是.success().done()' instead of .complete()`。不过,您可以可能会在整个回调中使用一些逻辑。
        • 查看更新问题。它不是最漂亮的,基本上在 ajax 调用之前,将标志 cs (coninue success) 设置为 true。只要它是真的,继续。麻烦的是,如果你有几个 ajax 调用同时运行,全局 var cs 可能会受到错误回调的影响。
        猜你喜欢
        • 1970-01-01
        • 2012-01-10
        • 1970-01-01
        • 2023-03-17
        • 2015-07-20
        • 1970-01-01
        • 1970-01-01
        • 2012-07-09
        • 1970-01-01
        相关资源
        最近更新 更多