如何触发基于服务器响应的jquery.ajax()错误callback,而不是HTTP 500?

通过使用jQuery的ajaxfunction,我可以做一些事情:

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

根据上面的代码,我有两个问题要问:

  1. 什么时候会调用jquery.ajax() errorcallback?

  2. 如果服务器响应我一个string消息“ 有一个错误 ”的JSON对象。 这意味着请求仍然发送成功,但我得到了服务器响应{message: "There is an error"}

我想不pipe是什么string值服务器响应,如果客户端得到服务器的响应, jquery.ajax() successcallback将被触发无论如何。

我想问一下,如果服务器专门返回给我一个string值的JSON对象,如{message: 'There is an error'} ,服务器可以做一些事情,使这个响应可以在jquery.ajax() errorcallback处理successcallback?

错误callback将被执行时,从服务器的响应不会是你所期待的。 所以例如在这种情况下它:

  • 已收到HTTP 404/500或任何其他HTTP错误消息
  • 收到了不正确types的数据(即您已经预期JSON,您已收到其他内容)。

在你的情况下,数据是正确的(这是一个JSON消息)。 如果你想根据接收到的数据的值手动触发错误callback,你可以这么做很简单。 只要将匿名callback的错误更改为命名函数。

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

我们假设服务器正在发送JSON,并且在成功的请求的情况下,我们会得到这样的东西:

 { success: true, data: { name: 'Foo' } } 

…和失败:

 { success: false, error: 'Something bad happened.' } 

然后我们简单地用$ .Deferred过滤响应:

 $.get('http://localhost/api').then(function(res) { var filter = $.Deferred(); if (res.success) { filter.resolve(res.data); } else { filter.reject(res.error); } return filter.promise(); }).done(function(data) { console.log('Name:', data.name); // Outputs: Foo }).fail(function(error) { console.log('Error:', error); // Outputs: Something bad happened. }) 

错误callback是当Ajax往返不能成功完成时,而不是基于你的服务器逻辑。 这将是你的责任,检查你认为是成功的callback内成功的回应。 即添加一个单一的IF条件,检查消息是否=“有错误”。 并在其中包含错误逻辑,否则请执行成功逻辑。

一个做你要求的方法是让服务器在出现错误时返回404头,然后由错误callback处理。 这种方法的问题是,如果存在实际的错误,那么您将隐藏起来,而您将无法通过它传递额外的数据。

最简单的事情就是重组像这样:

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

一个简单的方法就是使用jQuery always()函数进行callback,然后如果你想手动创build一个错误,只要利用鸭子打字!

例如:

 $.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未find。 如果你想手动返回一个错误,你可以模拟正常传递错误的XHR对象(例如在PHP中):

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