2012-08-11 10 views
25
function ajax_test(str1){ 
    var url = "None" 
    jq.ajax({ 
    type:'post', 
    cache: false, 
    url: 'http://....' + str1, 
    success: function(data, status, xhr){ 
     url=data; 
    }, 
    error: function (xhr, status, e) { 
    }, 
    async: true, 
    dataType: 'json' 
    }); 
    return url 
} 

Come è possibile impostare la variabile globale url come dati di successo ajax restituiti?jquery chiamata ajax success, come posso cambiare una variabile globale nella funzione javascript del wrapper?

+0

Hai bisogno di fare qualcosa con 'url' solo una volta che il successo è stato lanciato? – NicoSantangelo

+0

Non è globale, perché ha la parola chiave var di fronte. Penso che tu intenda la portata esterna. – maximus

+0

Grazie per le risposte rapide! @maximus sì ambito esterno è quello che intendevo. Ho un URL valido, ho appena estratto la parte di dettaglio. – sammiwei

risposta

24

In Javascript, è impossibile per una funzione a return un risultato asincrono. La funzione di solito ritorna prima che la richiesta AJAX sia stata fatta.

Puoi sempre forzare la tua richiesta a essere sincrona con async: false, ma di solito non è una buona idea perché causerà il blocco del browser mentre attende i risultati.

Il modo standard per aggirare questo è utilizzando una funzione di richiamata.

function ajax_test(str1, callback){ 
    jq.ajax({ 
    //... your options 
    success: function(data, status, xhr){ 
     callback(data); 
    } 
    }); 
} 

e poi si può chiamare in questo modo:

ajax_test("str", function(url) { 
    //do something with url 
}); 
+0

Questo potrebbe non essere quello che l'OP ha chiesto specificamente, ma è il modo giusto di fare le cose. +1 –

+0

C'è qualche contraddizione nei tuoi primi 2 paragrafi. È impossibile restituire un risultato asincrono [a meno che non si usi 'async: false' che dovrebbe essere evitato a meno che non sia strettamente necessario come spiegato nel secondo paragrafo]. Comunque è spiegato bene. –

+0

@ FabrícioMatté No, non è una contraddizione perché se si utilizza 'async: false', non è più asincrono. –

2

Ecco il mio codice di esempio per il recupero dei dati da PHP, e quindi passare il valore a una variabile globale javascript all'interno della funzione ajax successo. Per me funziona!

var retVal = null; 

function ajaxCallBack(retString){ 
    retVal = retString; 
} 

function readString(filename){ 
    $.ajax({ 
     type: "POST", 
     url: "readString.php", 
     data: { 'fn': filename },  
     success: function(response){ 
      ajaxCallBack(response); 
     } 
    }); 
} 

codice PHP (readString.php):

<?php 

    $fn = $_POST['fn']; 

    $file = fopen("path/".$fn.".record","r"); 
    $string = fread($file,filesize("path/".$fn.".record")); 
    fclose($file); 

    echo $string; 
?> 

Tuttavia, da $ .ajax() ha inviato le richieste in modo asincrono, il che significa che può restituire prima dell'esecuzione del successo di richiamata, non si deve fare affidamento su funziona in sequenza e restituisce il valore da solo. Pertanto, qui si assegna il valore di risposta php al valore globale nella funzione di callback.

Problemi correlati