如何通过Ajax" .fail()"处理HTTP Response 500错误代码触发?

时间:2014-11-03 13:41:19

标签: javascript jquery ajax xmlhttprequest

我正在运行一些jQuery代码突然间我通过Firebug控制台看到,当我强制500错误时,.fail()方法中的代码没有被触发:

$.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 Status设置为“500”,例如,通过Ajax调用POSTING一个无效字段,比如在数据库中搜索不是的电子邮件现在,然后通过ajax显示错误:

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

任何想法为什么?我只想使用新方法 fail() done()我知道我可以使用statusCode处理程序来执行此操作。

但如果可以的话,我总是喜欢跟随新趋势。至少我想尝试一下。

非常感谢!

2 个答案:

答案 0 :(得分:0)

替代方法,通过最初通过.done()过滤回复,然后通过过滤延迟调用.fail().always()来替代直接调用.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() param的情况下调用_xmlResponse,这应该处理生成的.fail()(如果responseText包含“无效”)和净错误.fail()电话(例如statusCode 500; textStatus error)和.done()电话。

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

可选地,链从promise request返回.always()data数组包含request个返回值;在.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/

答案 1 :(得分:0)

我认为这取决于参数“xml”,如果: 1. xml是一个真正的xml对象,它会触发'完成'; 2. xml不是xml对象,它会触发'fail'

即使你返回500错误代码,它仍然是一个有效的xml对象,所以它会触发“完成”