6

设置

在我维护的 Web 应用程序中,有很多 AJAX 调用来提交表单,如下所示:

jQuery.post($form.attr("action"), $form.serialize())
    .always(commonProcessing)
    .done(function() {
        // the post succeeded, do something specific (e.g. close a dialog)
    });

commonProcessing函数在 JSON 响应中查找“众所周知的”部分并采取适当的措施(响应还可能包括特定于请求的信息)。它的内容如下:

function commonProcessing(result, outcome) {
    switch (outcome) {
        case "success":
            if (result.notify) {
                // show a growl-style notification
            }
            else if (...) ;
            break;
        case "error":
            // show a generic "unexpected error" notification
            break;
    }
}

问题

在许多情况下,我更愿意返回一个 HTTP 错误代码——比如 400 表示提交的表单包含无效数据——因为除了这是事物的自然顺序之外,它还允许我方便地放置“成功的请求” ".done处理程序中的代码(如果返回 200 OK,则内容将始终被解析,但.done处理程序需要尝试找出这是“错误”还是“真正 OK”响应)。同时,我想在发生错误时用特定信息响应请求(例如,notify对象可以包含一条错误消息,准确解释请求的错误之处)。

问题是当返回 HTTP 错误代码时,jQuery 不会尝试解析响应内容,在这种情况下,result参数是 jqXHR 对象而不是典型的解析 JSON。

有没有优雅的说法“我知道有错误,但我也希望你解析响应内容”?我当然可以这样做,$.parseJSON(result.responseText)因为我们谈论的是 JSON,但这感觉很笨拙,因为它回避了嗅探内容类型并进行解析的所有漂亮的jQuery 代码。

4

4 回答 4

2

使用 try/catch 代码块怎么样?

try{ 
     var response = $.parseJSON(response) etc 
}
catch(error){ 
     console.log(error) //error handling here
}

这就是我用来解释响应不是预期的 JSON 格式而是某种错误代码的实例。如果我误解了这个问题,请提前道歉!

于 2012-09-28T16:06:42.503 回答
1

我不认为您可以修改 jqXHR 对象以使其行为如此。通过 API(此处)查看可能解决您的问题的最接近我的事情是overrideMimeType()方法。就像是:

beforeSend: function(xhr){
    xhr.overrideMimeType("application/json; charset=UTF-8");
}

如果您希望以更细粒度的方式进行控制,为什么不手动实现 AJAX 调用并以您需要的格式返回您想要的对象呢?

于 2012-08-23T14:57:46.827 回答
0

您可以通过以下方式轻松管理回调:

$.ajax({
  url: $form.attr("action"),
  type: 'POST',
  data: $form.serialize(),
  complete: function(response) {},
  success: function(response) {},
  error: function(response) {}
});
于 2012-08-23T13:43:40.340 回答
-1

我试图保持对错误响应主体的控制的方法是,我编写了我的 php 来捕获大多数可能出错的东西并仍然返回一个有效的 json 对象,并且在我的 JS 成功回调中,我在那里处理那个对象.

success: function( response ) {
    if(response) {

    } else {

    }
},
error: function( xhr ) {
    //everything worse gets sent here
}

从那时起,任何导致丑陋错误代码的真正基本错误都将由错误回调处理。

于 2012-09-11T18:16:44.523 回答