18

jQuery 1.5 の時点で、XMLHTTPRequest の W3C 仕様に従って、ajax メソッドは success() ハンドラーを呼び出すことによって 304 Not Modified 応答を正しく処理するようになりました。これにより、サーバーが実際にデータを返さなかったとしても (最新のデータが既にキャッシュされているため)、アプリケーションはリクエストを成功として扱うことができます。

通常の (キャッシュされていない) GET 要求の場合、成功ハンドラーは次の引数で呼び出されます。

  • data: { サーバーからのデータ }
  • 状態:OK
  • jqXHR:
    • ステータス:200
    • ステータステキスト: OK
    • responseText: { サーバーからのデータ }

キャッシュされた GET リクエストの場合、成功ハンドラーは次の引数で呼び出されます。

  • データ: 未定義
  • ステータス: 変更されていません
  • jqXHR:
    • ステータス: 304
    • statusText: 変更されていません
    • responseText: {キャッシュからのデータ}

(少なくとも、マニフェスト ファイルを介してアプリケーション キャッシュを使用する Web アプリの場合、これは IOS 4.2 で返される方法です。これは、ほとんどのプラットフォーム/ブラウザーでの一般的なブラウザー キャッシュで一貫していると想定しています)。

「data」引数は、リクエストが 200 OK の場合にのみ入力されることがわかります。ここで、jqXHR.responseText には、そのデータがサーバー (200 OK) からのものか、キャッシュ (304 Not Modified) からのものかに関係なく、常にデータが取り込まれます。

ほとんどの GET リクエストでは、取得したデータがどこから来たかに関係なく、成功ハンドラーが何らかの処理を行うことを考えると、成功コードで常に jqXHR.responseText を使用することが最も理にかなっているように思われます。このようなことをするのではなく:

if ("notmodified" === status) {
  // do something with jqXHR.responseText
} else {
  // do something with data
}

または、jqXHR.responseTextが成功ハンドラーに入力されず、データ引数入力される場合はありますか?

コードベースを調べて、すべての成功ハンドラーを変更する必要があります (以前は、キャッシュからでも常にデータを返す jQuery 1.4.2 を使用していました)。ですから、正しい方法で処理していることを確認したいだけです。(最後までやりたくないのですが、別の方法でやるべきだったと気づきません)。

4

2 に答える 2

7

質問の明らかな欠陥を見つけました....データは常にテキストであると想定していたので、データ引数に優先して jqXHR.responseText を使用することは理にかなっています。

ただし、dataType が JSON、JSONP、スクリプトなどの場合...304 Not Modified 応答で返されたデータが未定義として返された場合は、最初に jqXHR.responseText を文字列から目的の型に変換する必要があります。 、例えば。

if (data === undefined) {
  data = $.parseJSON(jqXHR.responseText);
}

...そして、本当に必要な場合にのみ、この (潜在的に高価な) 変換を行いたいと思うでしょう。

考えてみると、ちょっと理にかなっています...データは常にサーバーから返されたものになります(場合によっては、304に対して未定義ではない可能性があります...たとえば、サーバーは追加のテキスト/htmlを返す可能性があります); これにより、開発者は 304 の場合に何をしたいかを柔軟に選択できます。

  • サーバーからの応答を表示する (存在する場合)
  • jqXHR.responseText を使用する
  • まったく別のことを...
于 2011-03-07T03:18:35.277 に答える