设置
在我维护的 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 代码。