セットアップ
私が維持している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
引数は、通常の解析された JSON ではなく、jqXHR オブジェクトです。
「エラーがあったことはわかっていますが、レスポンスの内容も解析してほしい」というエレガントな言い方はありますか? $.parseJSON(result.responseText)
JSON について話しているので、もちろんそうすることができますが、コンテンツ タイプをスニッフィングして解析するすべての優れたjQuery コードを回避するため、それはぎこちなく感じられます。