jsonp inkonsistenter Fehler: Objekt ist keine Funktion

7

Ich versuche, jsonp mit jQuery zu verwenden, aber ich bekomme inkonsistente Verhaltensweisen. Manchmal funktioniert das Skript, manchmal nicht; Ich verstehe nicht wirklich warum.

Dies ist der Fehler, der möglicherweise von Chrome angezeigt wird:

%Vor%

Im folgenden Beispiel versuche ich nur zu überprüfen, ob die Anwendung online ist oder nicht. Dieses inkonsistente Verhalten kann jedoch auch bei anderen ähnlichen Ajax-Aufrufen auftreten:

%Vor%

Die serverseitige PHP-Datei ist auch ziemlich einfach:

%Vor%     
Yako 09.03.2013, 19:03
quelle

3 Antworten

5

Ihre Frage ist nicht so klar, ich bekam den gleichen Fehler, wenn ich versuchte, denselben Callback-Funktionsnamen zweimal zu verwenden. In jedem Fall sollte der jsonp in jquery aufgerufen werden:

%Vor%     
user2198393 22.03.2013, 08:32
quelle
15

Sie erhalten dieses Verhalten, wenn Ihr JSONP-Anruf abläuft (entsprechend Ihrer timeout: 2000 -Zeile zwei Sekunden), die Daten jedoch nach Ablauf der Zeitüberschreitung eintreffen.

JSONP verwendet keinen normalen XmlHTTPRequest. Um JSONP zu verwenden, fügt jQuery ein Skript-Tag in Ihr Dokument ein und führt eine temporäre Funktion aus, um das Laden des Script-Tags zu verarbeiten (der Funktionsname ist die lange Zufallszeichenfolge in der Fehlermeldung).

Wenn Ihre Zeitüberschreitung auftritt und das Skript noch nicht fertig geladen wurde, verwirft jQuery die temporäre Funktion. Einige Zeit später beendet das Skript-Tag das Laden und versucht, diese Funktion aufzurufen - aber es ist zu spät, die Funktion wurde gelöscht. Daher der Fehler.

Möglicherweise können Sie weniger Fehler bekommen, indem Sie Ihr Zeitlimit verlängern, aber das grundlegende Problem besteht darin, dass Sie das Laden eines Skript-Tags nicht abbrechen können. Wenn es nicht zu Fehlern gekommen ist, besteht immer die Möglichkeit, dass es etwas länger dauert als die Zeitüberschreitung. Soweit ich weiß, gibt es dafür keine saubere Lösung. Sie können jQuery anweisen, eine explizit benannte Funktion als JSONP-Callback zu verwenden, anstatt eine eigene Funktion zu verwenden, aber dann müssen Sie im Auge behalten, ob die Sache selbst abgelaufen ist. Sie könnten CORS verwenden, was eine andere Sache ist.

Wahrscheinlich ist Ihre beste Wette, damit zu leben.

    
Daniel Baird 21.11.2013 05:34
quelle
2

Überprüfen Sie, ob Ihr Skript mehr als einmal hintereinander eine identische AJAX-Anfrage erstellt.

Ich hatte einen fehlerhaften Event-Handler, der zwei Anfragen gleichzeitig ausgelöst hat und das gleiche Problem verursacht hat.

(Ich gehe davon aus, dass Sie $ .ajaxSetup einmal aufrufen): Es sieht so aus, als ob Sie einen Cache-Buster für Ihre Ping-Aufrufe anwenden möchten, aber das Ausführen in $ .ajaxSetup kann den gegenteiligen Effekt haben, da die URL für alle behoben wird nachfolgende Anfragen.

    
owksley 15.03.2013 10:56
quelle

Tags und Links