2013-03-09 16 views
7

Sto provando a utilizzare jsonp con jQuery ma ottengo comportamenti inconsistenti. A volte la sceneggiatura funziona, a volte no; Non capisco davvero perché.jsonp errore incoerente: l'oggetto non è una funzione

Questo è l'errore che può essere visualizzato da Chrome:

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

Nel seguente esempio, sto solo cercando di verificare se l'applicazione è in linea oppure no. Ma questo comportamento incoerente può accadere in altre chiamate Ajax simili:

 $.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(); 

Il file lato server PHP è piuttosto semplice troppo:

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

risposta

5

la tua domanda non è chiara, stavo ricevendo lo stesso errore quando ho provato ad usare lo stesso nome di funzione di callback due volte. In ogni caso questo è come il jsonp dovrebbe essere chiamato in jQuery:

 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

Controlla se lo script sta facendo una richiesta AJAX identica più di una volta in successione.

Ho avuto un gestore di eventi difettoso che ha sparato due richieste contemporaneamente e questo ha causato lo stesso problema.

(presumo che tu chiami $ .ajaxSetup una volta): Sembra che tu intenda applicare un cache buster per le tue chiamate ping, ma farlo in $ .ajaxSetup potrebbe avere l'effetto opposto perché l'URL verrà corretto per tutte le richieste successive.

15

Otterrete questo comportamento quando i tuoi JSONP tempi di chiamata fuori (che è due secondi, in base alla vostra linea timeout: 2000), ma i dati arrivano dopo il timeout è successo.

JSONP non utilizza un normale XmlHTTPRequest. Per eseguire JSONP, jQuery inserisce un tag script nel documento e crea una funzione temporanea per gestire il caricamento del tag script (il nome della funzione è quella stringa casuale lunga nel messaggio di errore).

Quando si verifica il timeout e lo script non ha ancora completato il caricamento, jQuery scarta la funzione temporanea. Qualche tempo dopo, il tag script termina il caricamento e tenta di invocare quella funzione, ma è troppo tardi, la funzione è stata cancellata. Quindi l'errore.

Forse è possibile ottenere meno errori estendendo il timeout, ma il problema di base è che non è possibile annullare il caricamento di un tag di script. Se non si è verificato un errore, c'è sempre la possibilità che ci vorrà un po 'più del timeout. Per quanto ne so, non esiste una soluzione chiara per questo. Puoi dire a jQuery di usare una funzione con nome esplicito come callback JSONP invece di crearne una propria, ma poi dovrai tenere traccia di se la cosa è scaduta da te. Potresti usare CORS, che è un'altra cosa.

Probabilmente la soluzione migliore è conviverci.

Problemi correlati