如何触发基于服务器响应的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 } });
根据上面的代码,我有两个问题要问:
-
什么时候会调用jquery.ajax()
error
callback? -
如果服务器响应我一个string消息“ 有一个错误 ”的JSON对象。 这意味着请求仍然发送成功,但我得到了服务器响应
{message: "There is an error"}
。
我想不pipe是什么string值服务器响应,如果客户端得到服务器的响应, jquery.ajax() success
callback将被触发无论如何。
我想问一下,如果服务器专门返回给我一个string值的JSON对象,如{message: 'There is an error'}
,服务器可以做一些事情,使这个响应可以在jquery.ajax() error
callback处理success
callback?
错误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; } }