JSONP問題の検出
依存関係をダウンロードしたくない場合は、エラー状態を自分で検出できます。それは簡単です。
ある種のタイムアウトを使用することによってのみ、JSONPエラーを検出できます。特定の時間内に有効な応答がない場合は、エラーと見なします。ただし、エラーは基本的に何でもかまいません。
エラーをチェックする簡単な方法は次のとおりです。success
フラグを使用するだけです。
var success = false;
$.getJSON(url, function(json) {
success = true;
// ... whatever else your callback needs to do ...
});
// Set a 5-second (or however long you want) timeout to check for errors
setTimeout(function() {
if (!success)
{
// Handle error accordingly
alert("Houston, we have a problem.");
}
}, 5000);
コメントで言及されているdawnriderのように、代わりにclearTimeoutを使用することもできます。
var errorTimeout = setTimeout(function() {
if (!success)
{
// Handle error accordingly
alert("Houston, we have a problem.");
}
}, 5000);
$.getJSON(url, function(json) {
clearTimeout(errorTimeout);
// ... whatever else your callback needs to do ...
});
なんで?読む...
JSONPが簡単に機能する方法は次のとおりです。
JSONPは、通常のAJAXリクエストのようにXMLHttpRequestを使用しません。代わりに<script>
、「src」属性がリクエストのURLであるタグをページに挿入します。応答の内容はJavascript関数でラップされ、ダウンロード時に実行されます。
例えば。
JSONPリクエスト:https://api.site.com/endpoint?this=that&callback=myFunc
Javascriptは、このスクリプトタグをDOMに挿入します。
<script src="https://api.site.com/endpoint?this=that&callback=myFunc"></script>
<script>
タグがDOMに追加されるとどうなりますか?明らかに、それは実行されます。
したがって、このクエリへの応答が次のようなJSON結果を生成したとします。
{"answer":42}
ブラウザにとって、これはスクリプトのソースと同じであるため、実行されます。しかし、これを実行するとどうなりますか?
<script>{"answer":42}</script>
まあ、何も。それはただのオブジェクトです。保存も保存もされず、何も起こりません。
これが、JSONPリクエストが結果を関数にラップする理由です。JSONPシリアル化をサポートする必要があるサーバーは、callback
指定したパラメーターを確認し、代わりにこれを返します。
myFunc({"answer":42})
次に、これが代わりに実行されます。
<script>myFunc({"answer":42})</script>
...これははるかに便利です。この場合、コードのどこかに次のようなグローバル関数がありますmyFunc
。
myFunc(data)
{
alert("The answer to life, the universe, and everything is: " + data.answer);
}
それでおしまい。それがJSONPの「魔法」です。次に、タイムアウトチェックを組み込むのは、上記のように非常に簡単です。リクエストを行い、直後にタイムアウトを開始します。X秒後、フラグがまだ設定されていない場合、リクエストはタイムアウトになりました。