JSONP-Probleme erkennen
Wenn Sie keine Abhängigkeit herunterladen möchten, können Sie den Fehlerstatus selbst erkennen. Es ist einfach.
Sie können JSONP-Fehler nur mithilfe einer Zeitüberschreitung erkennen. Wenn in einer bestimmten Zeit keine gültige Antwort eingeht, wird ein Fehler angenommen. Der Fehler könnte jedoch grundsätzlich alles sein.
Hier ist eine einfache Möglichkeit, nach Fehlern zu suchen. Verwenden Sie einfach eine success
Flagge:
var success = false;
$.getJSON(url, function(json) {
success = true;
});
setTimeout(function() {
if (!success)
{
alert("Houston, we have a problem.");
}
}, 5000);
Wie der Fahrer in den Kommentaren erwähnt hat, können Sie stattdessen auch clearTimeout verwenden:
var errorTimeout = setTimeout(function() {
if (!success)
{
alert("Houston, we have a problem.");
}
}, 5000);
$.getJSON(url, function(json) {
clearTimeout(errorTimeout);
});
Warum? Weiter lesen...
So funktioniert JSONP auf den Punkt gebracht:
JSONP verwendet XMLHttpRequest nicht wie normale AJAX-Anforderungen. Stattdessen wird ein <script>
Tag in die Seite eingefügt, wobei das Attribut "src" die URL der Anforderung ist. Der Inhalt der Antwort wird in eine Javascript-Funktion eingeschlossen, die dann beim Herunterladen ausgeführt wird.
Zum Beispiel.
JSONP-Anfrage: https://api.site.com/endpoint?this=that&callback=myFunc
Javascript fügt dieses Skript-Tag in das DOM ein:
<script src="https://api.site.com/endpoint?this=that&callback=myFunc"></script>
Was passiert, wenn <script>
dem DOM ein Tag hinzugefügt wird? Offensichtlich wird es ausgeführt.
Angenommen, die Antwort auf diese Abfrage ergab ein JSON-Ergebnis wie:
{"answer":42}
Für den Browser ist das dasselbe wie für die Quelle eines Skripts, daher wird es ausgeführt. Aber was passiert, wenn Sie dies ausführen:
<script>{"answer":42}</script>
Naja nichts. Es ist nur ein Objekt. Es wird nicht gespeichert, gespeichert und es passiert nichts.
Aus diesem Grund verpacken JSONP-Anforderungen ihre Ergebnisse in eine Funktion. Der Server, der die JSONP-Serialisierung unterstützen muss, sieht den von callback
Ihnen angegebenen Parameter und gibt diesen stattdessen zurück:
myFunc({"answer":42})
Dann wird dies stattdessen ausgeführt:
<script>myFunc({"answer":42})</script>
... was viel nützlicher ist. Irgendwo in Ihrem Code befindet sich in diesem Fall eine globale Funktion mit dem Namen myFunc
:
myFunc(data)
{
alert("The answer to life, the universe, and everything is: " + data.answer);
}
Das ist es. Das ist die "Magie" von JSONP. Dann ist es sehr einfach, eine Zeitüberschreitungsprüfung einzurichten, wie oben gezeigt. Stellen Sie die Anfrage und starten Sie unmittelbar danach eine Zeitüberschreitung. Wenn Ihr Flag nach X Sekunden noch nicht gesetzt wurde, ist die Anforderung abgelaufen.