Javascript 如何基于服务器响应而不是HTTP 500触发jquery.ajax()错误回调?
通过使用jquery ajax函数,我可以执行以下操作:Javascript 如何基于服务器响应而不是HTTP 500触发jquery.ajax()错误回调?,javascript,ajax,spring,jquery,Javascript,Ajax,Spring,Jquery,通过使用jquery ajax函数,我可以执行以下操作: $.ajax({ url: url, type: 'GET', async: true, dataType: 'json', data: data, success: function(data) { //Handle server response here }, error: function(xhr, status, error){ //Handle failure here
$.ajax({
url: url,
type: 'GET',
async: true,
dataType: 'json',
data: data,
success: function(data) {
//Handle server response here
},
error: function(xhr, status, error){
//Handle failure here
}
});
基于上述代码,我有两个问题要问:
error
回调{message:“有一个错误”}
success
回调
我想问一下,服务器是否会专门向我返回一个JSON对象,该对象具有字符串值,如
{message:'saerror'}
,服务器是否可以做些什么,以便在jquery.ajax()中处理此响应错误
回调而不是成功
回调?错误回调用于Ajax往返无法成功完成时,而不是基于服务器逻辑。这是你的责任,检查你认为是成功回调内成功的反应。i、 e.添加一个IF条件,检查消息=“有错误。”并在其中包含错误逻辑,否则执行成功逻辑
执行您要求的操作的一种方法是在出现错误时让服务器返回404头,然后由错误回调处理。这种方法的问题是,如果存在实际错误,您将被隐藏,并且无法传递附加数据。当来自服务器的响应与您期望的不符时,将执行错误回调。例如,在这种情况下:
- 已收到HTTP 404/500或任何其他HTTP错误消息
- 接收到不正确类型的数据(即,您期望JSON,但收到了其他内容)
function handleError(xhr, status, error){
//Handle failure here
}
$.ajax({
url: url,
type: 'GET',
async: true,
dataType: 'json',
data: data,
success: function(data) {
if (whatever) {
handleError(xhr, status, ''); // manually trigger callback
}
//Handle server response here
},
error: handleError
});
最简单的做法是这样重组:
function handleAjaxError function(xhr, status, error) {
//Handle failure here
}
$.ajax({
url: url,
type: 'GET',
async: true,
dataType: 'json',
data: data,
success: function(data) {
//Handle server response here
if (data.message == 'There is an error')
{
handleAjaxError();
return;
}
//... all is good....
},
error: handleAjaxError
});
我们假设服务器正在发送JSON,如果请求成功,我们将得到如下结果:
{
success: true,
data: {
name: 'Foo'
}
}
。。。失败时:
{
success: false,
error: 'Something bad happened.'
}
然后,我们只需使用以下方法过滤响应:
一种简单的方法是对回调函数使用jQuery always()函数,如果您想手动创建错误,只需利用Duck类型 例如:
$.get(url, {"data": data}).always(function(result)
{
if (typeof result.status !== "undefined" && result.status !== 200) // Status code 200 represents Success/OK
{
//handle error
error = "Your error was " + result.status + " " + result.statusText;
}
else
{
//success
}
});
如果存在诸如404未找到之类的自然头错误,则始终会运行错误部分。如果要手动返回错误,可以模拟通常传递错误的XHR对象(例如,在PHP中):
这个最初的问题是几年前发布的,也许现在有更好的方法来处理这个问题。这里有一个处理多种类型错误的建议,包括OP的问题 输入类型(错误)示例#1
函数句柄错误(类型){
类型=类型| |“连接问题”;
var value=“出现错误:”+类型;
警报(值);
}
功能检查错误(响应){
如果(响应=“DB_错误”){
handleError(“服务器错误”);
抛出新错误(“JS死亡”);//可选,禁止运行其他脚本
}
}
变量示例={
成功:功能(响应){
checkIfError(响应);//如果出现错误消息,请检查数据
//当正确的数据发送时做一些事情
警报(响应);
},错误:handleError//连接错误,调用错误消息
};
test1=示例['error']()代码>我明白了,所以没有办法根据服务器响应的内容触发错误回调,对吗?@Leem这只是一个函数。。。我很难弄明白为什么你希望发生这种情况,而不是检查响应数据中的错误。不过我添加了一个hack方法。我想看看在我的情况下是否有可能触发错误回调,希望这个动机不会给你带来更多的困难。雷尔的回答让我明白了。也谢谢。为什么要在一个单独的位置定义handleError?为什么不这样内联定义它:error:handleError=function(xhr,status){//handle server response here}
@dallin,因为它允许您不复制代码。服务器可能会响应代码200,这将触发“success”回调。或者,像400、404或500这样的错误代码会触发“错误”回调。在这两种情况下,您可能都希望以集中的方式处理错误。@MichaelButler我想您可能误解了我的建议。我相信您可以直接在error属性中定义一个名为handleError的函数(error:handleError=function(xhr,status))。这允许您仍然手动调用函数,并在集中位置处理错误。它将在ajax调用中直接保留错误处理,进一步集中处理。这里有一个JSFIDLE和一个简化的示例:@dallin谢谢,我不知道你能做到这一点。可以说,你的解决方案将两全其美。
$.get(url, {"data": data}).always(function(result)
{
if (typeof result.status !== "undefined" && result.status !== 200) // Status code 200 represents Success/OK
{
//handle error
error = "Your error was " + result.status + " " + result.statusText;
}
else
{
//success
}
});
public function ServerSideAjaxResponse($data)
{
if (!$data)
{
$response["status"] = 1001; //Make up your own error codes! Yippee! Fun!
$response["statusText"] = "Error! You forgot to send the data!";
echo json_encode($return);
return;
}
}