2013-03-09 18 views
7

Ich versuche, jsonp mit jQuery zu verwenden, aber ich bekomme inkonsistente Verhaltensweisen. Manchmal funktioniert das Skript, manchmal nicht; Ich verstehe nicht wirklich warum.Jsonp inkonsistent Fehler: Objekt ist keine Funktion

Dies ist der Fehler, die von Chrome angezeigt:

Uncaught TypeError: Property 'jQuery18208278296771459281_1362854738133' of object [object Object] is not a function 

Im folgende Beispiel versuche ich, ob die Bewerbung online ist oder nicht nur zu überprüfen. Aber das inkonsistente Verhalten auf anderen ähnlichen Ajax-Aufrufen passieren kann:

 $.ajaxSetup({ 
     error: function (req, status, ex) {}, 
     success: function (data, status, req) {}, 
     timeout: 2000, 
     crossDomain: true, 
     contentType: "application/json", 
     dataType:"jsonp", 
     url: "http://myUrl.com/ping.php?preventCache="+new Date() 
    }); 
    return $.ajax(); 

Die Server-Seite PHP-Datei ist auch ziemlich einfach:

<?php 
header("Content-Type: application/javascript; charset=UTF-8"); 
echo $_GET['callback']; 
?> ({ "status": "online" }) 

Antwort

5

Ihre Frage ist nicht so klar, ich bekam den gleichen Fehler, wenn versucht wurde, den gleichen Callback-Funktionsnamen zweimal zu verwenden. dies ist in jedem Fall, wie die JSONP in Jquery aufgerufen werden sollen:

 var mycallback = 'c'+Math.floor((Math.random()*100000000)+1); 
     $.ajax({ 
        type: 'GET', 
        url: URL, 
        async: true, 
        jsonpCallback: mycallback, 
        contentType: "application/json", 
        dataType: 'jsonp' 

     }).done(function(json){ 
      console.log(json); 
        callback(json); 
     }).fail(function(f){ 
      console.log("f"); 
        console.log(f.status); 
     }).always(function(){ 
        // console.log('complete'); 
     }); 
2

überprüfen Sie, ob Ihr Skript macht eine identische AJAX-Anforderung mehr als einmal in Nachfolge.

Ich hatte eine fehlerhafte Event-Handler, die zwei Anfragen zur gleichen Zeit abgefeuert und das gleiche Problem verursacht.

(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 dies in $ .ajaxSetup kann den gegenteiligen Effekt haben, weil die URL behoben wird alle nachfolgenden Anfragen

15

Sie werden dieses Verhalten erhalten, wenn Ihre JSONP Anrufzeiten aus (die zwei Sekunden, nach Ihrer timeout: 2000 Linie), aber die Daten kommen nach Die Zeitüberschreitung ist eingetreten.

JSONP verwendet keinen normalen XmlHTTPRequest. Um JSONP auszuführen, fügt jQuery ein Skript-Tag in Ihr Dokument ein und führt eine temporäre Funktion aus, um das Laden des Skript-Tags zu verarbeiten (der Funktionsname ist die lange zufällige Zeichenfolge 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 durch Verlängerung der Zeitüberschreitung erhalten, 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. Du könntest CORS benutzen, was eine andere Sache ist.

Wahrscheinlich ist Ihre beste Wette, damit zu leben.

Verwandte Themen