Funzione Javascript con JQuery POST Restituisce sempre indefinito
-
05-07-2019 - |
Domanda
Non ho idea di cosa stia succedendo qui e spero che qualcuno possa aiutare, sono sicuro che è qualcosa di facile che mi manca.
Ho una funzione in javascript che contiene un post JQuery al suo interno. Vorrei restituire i risultati del post che è solo un testo e inserirlo in una variabile. Il numero sta tornando correttamente dalla Posta ma quando lo inserisco nella variabile, la variabile dice "non definito". Qualche idea?
var total = GetTotalSize();
alert(total);
function GetTotalSize(){
var i = "";
$.post("Handlers/GetTotal.ashx", {id : $("#hID").val()}, function(data){
i = data.toString();
return i;
});
}
Soluzione
Non puoi farlo in quel modo. Ricorda, il " A " in AJAX significa "asincrono". La funzione di callback fornita a $ .post ()
verrà eseguita correttamente dopo l'esecuzione e la restituzione di GetTotalSize ()
.
Dovrai ristrutturare il tuo codice per adattarlo. Non posso essere specifico nella mia raccomandazione perché non so come sia il resto del tuo codice, ma ecco una possibilità.
$.post("Handlers/GetTotal.ashx", {id : $("#hID").val()}, function(data)
{
doSomethingWithTotalSize( data.toString() );
});
function doSomethingWithTotalSize( totalSize )
{
// whatever
}
Altri suggerimenti
Peter ha assolutamente ragione, ma puoi forzare il metodo $ .ajax a funzionare in modo sincrono passando async: false
.
Il problema è che stai restituendo i
al di fuori della funzione di callback. Fondamentalmente quando si restituisce i
, il suo contenuto non esiste ancora e non esisterà fino a quando il server non restituirà i dati alla funzione di callback.
Prova questo
function GetTotalSize(callback) {
$.post("Handlers/GetTotal.ashx", {id : $("#hID").val()}, function(outputData) {
callback(outputData);
});
}
function DoSomething(data)
{
//....
}
GetTotalSize(DoSomething);
Mi rendo conto che questo è un post più vecchio, ma una soluzione per me era usare complete: [delegate]
anziché success
. Questo assicura che il callback
sia completo.