如何根据服务器响应触发jquery.ajax()错误回调,而不是HTTP 500?

Lee*_*eem 41 javascript ajax jquery spring

通过使用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

 }

});
Run Code Online (Sandbox Code Playgroud)

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

  1. 什么时候error调用jquery.ajax()回调?

  2. 如果服务器使用字符串消息" 有错误 " 向我回复json对象怎么办?这意味着请求仍然成功发送,但我得到了服务器响应{message: "There is an error"}.

我认为无论服务器响应什么字符串值,如果客户端得到服务器的响应,无论如何都会触发jquery.ajax() success回调.

我想问一下服务器是否特意向我返回一个字符串值为的JSON对象{message: 'There is an error'},服务器可以执行某些操作以便可以在jquery.ajax() error回调而不是success回调中处理此响应吗?

RaY*_*ell 33

当服务器的响应不符合您的预期时,将执行错误回调.例如,在这种情况下,它:

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

在您的情况下,数据是正确的(这是一个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
});
Run Code Online (Sandbox Code Playgroud)

  • 为什么在一个完整的单独位置定义handleError?为什么不像这样直接定义它:`error:handleError = function(xhr,status){//在这里处理服务器响应} (3认同)
  • @dallin 因为它允许您不重复代码。服务器可能会使用代码 200 进行响应,从而触发“成功”回调。或者,像 400、404 或 500 这样的错误代码会触发“错误”回调。在这两种情况下,您可能都希望以集中方式处理错误。 (2认同)

Sim*_*ken 26

我们假设服务器正在发送JSON,如果请求成功,我们将得到如下内容:

{
    success: true,
    data: {
        name: 'Foo'
    }
}
Run Code Online (Sandbox Code Playgroud)

......并且失败了:

{
    success: false,
    error: 'Something bad happened.'
}
Run Code Online (Sandbox Code Playgroud)

然后我们只需使用$ .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.
})
Run Code Online (Sandbox Code Playgroud)

  • 太棒了 我认为这是OP实际要求的。 (2认同)