2014-11-03 105 views
0

我跑一些jQuery代碼的時候,突然我通過Firebug的控制檯看到,當我強迫一個500錯誤,裏面.fail代碼()方法,是不是被解僱:如何通過Ajax處理HTTP Response 500錯誤代碼「.fail()」trigger?

$.ajax({ 
    url: "someAction.do", 
    data: "param1=param&param2=param", 
    dataType: "xml" 
}).done(function(xml){ 
    //some stuff with my data 
}).fail(function(xml){ 
    //some other different stuff with my data that is not being fired 

}); 

在另一方面,一個Java Action,當發生錯誤時,我將HttpResponse狀態設置爲「500」,例如,通過Ajax調用發佈無效字段,例如在數據庫中搜索不存在的電子郵件,然後通過ajax顯示錯誤:

<xml version=bla,bla...> <item> <name>message</name> <value>Invalid input data</value> </item> </xml>

任何想法爲什麼?我只想使用新方法失敗()done()我知道我可以使用statusCode處理程序來做到這一點。

但我總是喜歡按照新的趨勢,如果我可以。至少我想嘗試一下。

非常感謝!

+0

不'錯誤'片段將'header'響應代碼設置爲'500'?謝謝 – guest271314 2014-11-03 15:36:55

+0

你是什麼意思?我如何設置狀態?我編碼response.setHeader(「狀態」,「500」);然後response.setStatus(500);因爲我不知道哪一個更好。我是一個前端Java超級管理員。謝謝 – 2014-11-03 16:21:26

+0

看到http://www.javamex.com/tutorials/servlets/http_status_code.shtml – guest271314 2014-11-03 16:35:09

回答

0

的另一種方法,代替通過.always()過濾反應最初,然後調用.done().fail()或通過濾波延遲直接調用.done().fail()或;維護處理實際淨誤差與同fail()回調的能力

// simulate server-side responses 
var error = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" 
      + "<item>" 
      + "<name>message</name>" 
      + "<value>Invalid input data</value>" 
      + "</item>"; 

var success = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" 
      + "<item>" 
      + "<name>message</name>" 
      + "<value>Success</value>" + "</item>"; 
// params 
$.ajaxSetup({ 
    beforeSend : function(jqxhr, settings) { 
     var d = decodeURIComponent(settings.data) 
        .match(/data=+.*/)[0] 
        .split(/=|&/); 
     var params = {}; 
     params[d[0]] = {}; 
     params[d[0]][d[1]] = d[2]; 
     params[d[0]][d[3]] = d[4]; 
     jqxhr.data = params; 
    } 
}); 

var request = function (url, _xmlResponse, data1, data2) { 
    var _response = new $.Deferred(), 
     _request = $.ajax({ 
      url: url, 
      type: "POST", 
      data: { 
       // responses 
       xml: _xmlResponse, 
       // params 
       data: "param1="+ data1 +"&param2="+ data2 
      }, 
      dataType: "xml" 
     }); 
    // check `responseText` for "Invalid" , 
    // check `textStatus` for actual net error , "error" 
    _request.always(function (xml, textStatus, jqxhr) { 
     console.log(xml, textStatus, jqxhr, "check"); 
     // simulate server-side processing, cont. 
     // if both object passed to server , 
     // `param1` and `param2` _do not_ have property 
     // with value of at `params` , `""` empty string - generic "error" , 
     // _and_ returned `responseText` contain "Invalid" , 
     // _or_ `textStatus` : `error` , `reject` `dfd` , call `.fail()` 
     // else `resolve `dfd` , call `.done()` 

     // check params 
     var test = [xml["data"] || jqxhr["data"]].every(function(v, k) { 
      return !(v.data["param1"] !== "" && v.data["param2"] !== "") 
     }) ; 
     // check `xml` responseText for node for "Invalid" text , 
     // generate `.fail()` 
     var check = $(xml.children) 
     .find("value").is(":contains(Invalid)"); 
     return check && test || textStatus === "error" 
       // call `.fail()` 
       ? _response.reject([xml, textStatus, jqxhr]) 
       // call `.done()` 
       : _response.resolve([xml, textStatus, jqxhr]) 
    }); 

    return _response 
    .done(function (xml) { 
     // do `done()` stuff 
     console.log(xml[0], xml[1], xml[2]); 
     var msg = $(xml[0].children).find("value").html(); 
     $("#success") 
     .html(msg + ", " 
        + xml[2].data.data.param1 
        + xml[2].data.data.param2 
      ); 
     return this.promise() 
    }) 
    .fail(function (xml) { 
     // do `.fail()` stuff 
     console.log(xml[0], xml[1], xml[2], "fail"); 
     var msg = $(xml[0].children).find("value").html() 
        || xml[1] + ", " + xml[2]; 
     $("#error") 
     .html(msg); 
     return this.promise() 
    }); 
}; 

然後可以調用request(),沒有_xmlResponse PARAM,應同時處理產生.fail()(如果responseText含有「無效」)和淨誤差.fail()呼叫(例如,statusCode500; textStatuserror)和.done()呼叫。

request("someAction.do", "param1_param", "param2_param"); 

任選地,鏈返回promiserequest.always(),作爲包含request返回值data陣列;在.done()fail()

request("someAction.do", "param1_param", "param2_param") 
.always(function(data) { 
    // do `.done()` , `.fail()` stuff , 
    // `data, textStatus, jqxhr` 
    console.log(data[0], data[1], data[2]) 
}) 

的jsfiddle http://jsfiddle.net/guest271314/ek15krb5/

0

被處理後,我覺得取決於參數 「XML」,如果: 1. XML是一個真正的XML對象,它會引發 '完成' ; 2. XML是不是一個XML對象,它會觸發即使你返回500錯誤代碼「失敗」

,它仍然是一個有效的XML對象,所以它會引發「完成」