2

我想知道你有这样的东西

// 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并且这确实停止了它,但我想知道如何指定只停止成功的那个。因为我的想法是,如果还有其他延期的,比如完整的,它也会被拒绝吗?

4

3 回答 3

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

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

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

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

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

于 2011-03-02T23:13:44.277 回答
0

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

当您向延迟对象添加回调时,即.success(.....它们被堆叠起来。一旦您的延迟对象解析当 ajax 成功完成时),它将运行所有堆叠的回调。然后尝试拒绝该对象为时已晚,例如停止运行任何更多成功回调。看看这里的例子

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


根据评论更新:

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

使用逻辑来终止回调。

于 2011-03-02T23:25:16.467 回答
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");});
于 2011-03-03T00:19:55.413 回答