3

私は次のようにサーバーからJSONデータをフェッチしようとしています:

var a = $.ajax({
    url: "data.json",
    dataType: 'json',
    data: null,
    error: function(data) {
        console.log("error");
    },
    success: function(data) {
        console.log("success");
    }
});

これを行うと、error関数が呼び出されます(errorコンソールに出力されます)。

しかし、不思議なことに、調べてみるaと、正しい応答テキストが返されていることがわかります。

a

readyState: 4
responseText: "contents of data.json!"
status: 200
statusText: "OK"

どうしたの?リクエストが成功した場合、成功コールバックが起動しないのはなぜですか?

4

2 に答える 2

4

おそらく、返される特定の値が指定したタイプではないためです。応答自体は成功ですが(「a」の詳細を見るとわかるように)、成功するかエラーを実行するかを決定する要因はそれだけではありません。「dataType」(戻り型)としてjsonを指定しましたが、文字列を受け取りました。テストの場合、それは問題ありませんが、ご覧のとおり、期待どおりに動作しません。dataTypeオプションを指定しない場合、jQueryは、mimeタイプと応答のコンテンツを調べて、返されるコンテンツタイプを判別しようとします。それらが一致しない場合のエラー(あなたの場合のように)。

アップデート:

私は上記の説明でぶらぶらしていることに気づきました。問題は解決したようですが、もう一度詳しく説明します。

あなたの状況でエラーが発生する可能性がいくつかありました。理解しておくべき重要なことは、「dataType」を設定すると、jQueryはそのタイプのresponseTextを解析しようとするということです。そのオプションを設定しない場合は、それに応じて推測して解析し(つまり、MIMEタイプを調べます)、そのように解析します。「dataType」を指定する場合、responseTextはJSONの形式である必要があります。したがって、「json」を指定し、文字列(この場合)を指定すると、jQueryの解析は失敗します。「dataType」とjQueryの推測を指定しない場合、responseTextはMIMEタイプと一致する必要があります。そのため、MIMEタイプが「application / json」の場合、文字列を返すことはできません。物事が一致しないとき、それはエラーが発生するときです。

うまくいけば、それが役立ちます!

于 2012-06-22T03:55:19.733 に答える
1

ただの予感ですが、返されるコンテンツタイプは「application / json」ですか?私の勘では、JSONが返されることが期待されているというエラーがありますが、解析されていないtext / html(またはその他のコンテンツタイプ)が返されています。

于 2012-06-22T03:56:17.627 に答える