Javascript 如何基于服务器响应而不是HTTP 500触发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

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

 }

});
基于上述代码,我有两个问题要问:

  • 何时调用jquery.ajax()
    error
    回调

  • 如果服务器向我响应一个json对象,并显示字符串消息“There is error”,该怎么办。这意味着请求仍然成功发送,但我得到了服务器响应
    {message:“有一个错误”}

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


    我想问一下,服务器是否会专门向我返回一个JSON对象,该对象具有字符串值,如
    {message:'saerror'}
    ,服务器是否可以做些什么,以便在jquery.ajax()中处理此响应
    错误
    回调而不是
    成功
    回调?

    错误回调用于Ajax往返无法成功完成时,而不是基于服务器逻辑。这是你的责任,检查你认为是成功回调内成功的反应。i、 e.添加一个IF条件,检查消息=“有错误。”并在其中包含错误逻辑,否则执行成功逻辑


    执行您要求的操作的一种方法是在出现错误时让服务器返回404头,然后由错误回调处理。这种方法的问题是,如果存在实际错误,您将被隐藏,并且无法传递附加数据。

    当来自服务器的响应与您期望的不符时,将执行错误回调。例如,在这种情况下:

    • 已收到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
    });
    

    最简单的做法是这样重组:

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