2009-06-05 7 views
7

Ho bisogno di fare una richiesta sincrona all'API last.fm, ma quando uso GET e json insieme, la richiesta diventa asincrona.richiesta jQuery JSON sincrona

il mio codice:

$.ajax({ 
     async: false, 
    dataType: "json", 
    url: "http://ws.audioscrobbler.com/2.0/?method=artist.getimages&artist="+artist+"&api_key="+apiKey+"&format=json&callback=?", 
    success: function(html){ 
      imgURL = html.images.image[1].sizes.size[0]["#text"]; 
    } 
}); 

Se rimuovo dataType: "json" o l'uso post, è sincrono di nuovo, ma io sono dipendente da utilizzando sia JSON e GET.

Qualche idea?

risposta

13

Ah, questo è perché si sta tentando di eseguire richieste tra domini e le richieste tra domini si basano su un tag di script dinamico, che non può mai essere sincrono, deve utilizzare datatype json e il metodo GET.

Se si esegue un POST o si rimuove il tipo di dati, si verificherà un errore di accesso a causa della politica same-origin. Tornerà immediatamente, ma come un fallimento.

+0

hmmm, credo che dovrò trovare un altro modo poi ... grazie per la risposta comunque. –

+0

Potrebbe riportare la stringa JSON come testo e analizzare la stringa JSON su un oggetto stesso nella sua funzione success() utilizzando json2.js da www.json.org? –

+0

@Lunchy Non senza qualcosa da gestire reindirizzare la richiesta dalla sua parte. L'unico modo per ottenere dati da un altro dominio è utilizzare il tag script e una funzione di callback. Sembra che il servizio sia orientato esattamente a ciò specificando la funzione di callback come URL. Puoi simulare il blocco, ma usando solo Javascript 1.7. http://hyperstruct.net/2008/5/17/synchronous-invocation-in-javascript-part-1-problem-and-basic-solution http://www.neilmix.com/2007/02/07/threading -in-javascript-17 / – cgp