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引数は、通常の解析された JSON ではなく、jqXHR オブジェクトです。

「エラーがあったことはわかっていますが、レスポンスの内容も解析してほしい」というエレガントな言い方はありますか? $.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 ( here ) を見ると、問題を解決する可能性のある最も近いものは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

エラー応答本文の制御を維持しようとする私の方法は、うまくいかない可能性のあるもののほとんどをキャッチし、それでも有効な json オブジェクトを返すように php を作成し、JS 成功コールバック内でそのオブジェクトを処理することです。 .

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

    } else {

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

それ以降、醜いエラー コードを引き起こす根本的なエラーはすべて、エラー コールバックによって処理されます。

于 2012-09-11T18:16:44.523 に答える