你能在jquery 1.5中停止延迟回调吗?

时间:2011-03-02 23:08:48

标签: jquery jquery-1.5 jquery-deferred

我想知道你有这样的事情

// 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 的东西,这确实阻止了它,但我想知道如何指定只停止成功的一个。既然我的想法是否还有其他类似的完备文件也会被拒绝呢?

3 个答案:

答案 0 :(得分:0)

当您的第一个成功函数评估来自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);
  }
});

这个例子假设当一切按计划进行时,你会得到字符串'success'。

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

您还可以在所有AJAX请求完成时将处理程序设置为执行。

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

答案 1 :(得分:0)

AFAIK不,您不能使用deferred object jQuery v1.5 .ajax()对象扩展延迟对象)。

当您向deferred object添加回调时,即.success(.....,它们会被堆叠起来。只要您的延迟对象resolves当ajax成功完成),它就会运行堆叠的所有回调。为时已晚,尝试reject该对象以阻止正在运行的更多成功回调。 查看示例here

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


根据评论更新:

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

使用逻辑来消除回调。

答案 2 :(得分:0)

如果您只有一个验证检查功能,您可以创建自己的延迟和附加处理程序,而不是直接创建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");});