我想知道你有这样的事情
// 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 的东西,这确实阻止了它,但我想知道如何指定只停止成功的一个。既然我的想法是否还有其他类似的完备文件也会被拒绝呢?
答案 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请求完成时将处理程序设置为执行。
答案 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");});