Utilizzando $ .post all'interno di una funzione JavaScript, non è possibile assegnare un valore a una variabile?
Domanda
Sto cercando di utilizzare $ .post all'interno di una funzione, ottenere i risultati, quindi restituire la funzione vera o falsa in base ai risultati del callback $ .post. Tuttavia, sembra che si verifichi la richiamata, DOPO l'evento di ritorno della funzione genitore.
Ecco il codice corrente la variabile ret è sempre indefinita, ma se lo avverto () all'interno del callback $ .post, restituisce il risultato corretto;
function elementExists(key, type, path, appid, pid){
var ret;
$.post('?do=elExists', {key: key, type: type, path: path, appid: appid, pid: pid},function(data){
ret = data;
});
alert(ret);
return ret;
}
Soluzione
Come hai scoperto, il post è fatto in modo asincrono. Se vuoi che sia sincrono, dovrai utilizzare ajax
e imposta il parametro async
su false. Sarebbe meglio, tuttavia, riconoscere che il post è asincrono e creare il codice in modo che l'azione eseguita dal callback sia indipendente dal metodo che invoca il post. Ovviamente, vuoi davvero fare qualcosa di diverso dall'allerta, ma senza sapere che cosa è difficile consigliarti su come effettuare il refactoring.
MODIFICA : capisco che il tuo codice sta verificando se esiste qualcosa, ma lo sta verificando per uno scopo. Se sapessimo quale fosse lo scopo, allora potrebbe essere possibile raccomandare come realizzarlo nel callback in modo che il metodo possa essere refactored.
Altri suggerimenti
function elementExists(key, type, path, appid, pid){
$.post('?do=elExists', {key: key, type: type, path: path, appid: appid, pid: pid},function(data){
alert(data);
});
}
la funzione (dati) è una richiamata (asincrona) che non puoi restituire valori del genere.
che il callback non viene chiamato fino a quando la pagina non viene terminata, ma il tuo " return ret " viene eseguito immediatamente dopo aver chiamato $ .post
Se si desidera impostarlo sincrono impostare async: false
Vedi i documenti http://docs.jquery.com/Ajax/jQuery.post#urldatacallbacktype
Il problema è che il codice viene eseguito in modo asincrono. Questo è l'avviso (ret) effettivamente chiamato prima di ret = data, che si verifica quando la richiesta Ajax è completata.
Puoi rendere sincrone le tue chiamate ajax (non consigliate) utilizzando async opzione o ridisegna il codice.