JSONを返すURLのAJAXポーリングが新しい応答を返さないようです(jQuery $ .ajax()メソッドを使用)
-
06-07-2019 - |
質問
私のプロジェクトでは、AJAXを使用して、JSON応答の特定のURLをポーリングする必要があります。私が行う最初のAJAX要求は、JSONコンテンツが必要であることをサーバーに警告し、応答の構築とキャッシュを開始して、 {" status" :" pending" } JSONの準備ができるまで、後続の各AJAXリクエストに対して。その時点で、応答がドキュメントに解析および表示できるコンテンツを含むJSONに変更されます。これは、URLが {" status" :" pending" } 。
URLからJSONを繰り返し要求するように機能するポーリング関数を設定しました。ただし、問題は、応答 {" status" :" pending" } URLに直接移動しても、完全なJSON応答が準備でき、配信されていることがわかります。何らかの理由で、私のポーリング機能はまだ {" status" :" pending" } 。
ポーリングコードを含むページを更新すると、通常、最初のリクエストで機能します。つまり、完全なJSON応答を取得します。それは何らかのキャッシュの問題だと信じるようになりますが、どこで、またはなぜかはわかりません。各AJAXリクエストが新しい応答を受け取るべきではありませんか、それとも $。ajax()呼び出しで設定できるものですか?
現在使用しているコードは次のとおりです。
function ajax_poll() {
$.ajax({
url: JSON_URL, // JSON_URL is a string containing the URL to poll
dataType: 'json',
error: function(xhr_data) {
display_error();
},
success: function(xhr_data) {
if (xhr_data.status == 'pending') {
poll++; // increment poll counter // poll is a global variable to track the number of requests made
if (poll < POLLS) { // POLLS is a global variable to set the maximum number of requests
setTimeout(function() { ajax_poll(); }, INTERVAL); // wait INTERVAL before another AJAX request
} else {
display_error();
}
} else {
success(xhr_data);
}
},
contentType: 'application/json'
});
}
success()は、ページにJSONコンテンツ(つまり、ポーリング中に利用可能になるのを待っているもの)を表示する関数です。
注目に値することの1つは、コードをローカルでテストし、ローカルの.jsonテストファイルをポーリングしながら、ファイルの内容を {&quot; status&quot;から変更できることです。 :&quot; pending&quot; } 探しているようなコンテンツを含む応答に対して、ポーリングインスタンス間でファイルを保存します。次のポーリングでは、コードは新しいコンテンツを認識し、期待どおりに動作します。ステージング環境では機能していません。
解決
&quot; cache:false&quot;
を追加してみてくださいオプション。
他のヒント
これが発生する可能性のある理由を説明するために:GET AJAXリクエストを発行している可能性がありますが、URLを差別化していません(たとえば、クエリ文字列に余分なデータはありません)。
ブラウザはこのリクエストを確認し、完全なリクエストでサーバーにヒットすることさえしません(おそらく条件付き304 GETリクエストを代わりに発行します)。これらすべての最終結果は、あなたが見ていると思われるアクティビティが見えないことです。
この問題を解決する簡単な方法は、AJAXリクエストの結果をキャッシュしないか、POSTリクエストを送信しないことです。キャッシュオプションへの影響については、他の記事で説明しています。 POSTアプローチの問題は、アクションによって何も保存していないため、GETリクエストで意図をよりうまく表現していることです。