La función Javascript con JQuery POST siempre devuelve indefinido
-
05-07-2019 - |
Pregunta
No tengo idea de lo que está pasando aquí y esperaba que alguien pudiera ayudar, estoy seguro de que es algo fácil que me estoy perdiendo.
Tengo una función en javascript que tiene una publicación JQuery dentro de ella. Me gustaría devolver los resultados de la publicación, que es solo texto y ponerlo en una variable. El número regresa correctamente de la publicación, pero cuando lo pongo en la variable, la variable dice "indefinido". ¿Alguna idea?
var total = GetTotalSize();
alert(total);
function GetTotalSize(){
var i = "";
$.post("Handlers/GetTotal.ashx", {id : $("#hID").val()}, function(data){
i = data.toString();
return i;
});
}
Solución
No puedes hacerlo así. Recuerde, la "A" en AJAX significa "asíncrono". La función de devolución de llamada que proporciona a $ .post ()
se ejecutará bien después de que GetTotalSize ()
se ejecute y regrese.
Tendrá que reestructurar su código para acomodar esto. No puedo ser específico en mi recomendación porque no sé cómo se ve el resto de su código, pero aquí hay una posibilidad.
$.post("Handlers/GetTotal.ashx", {id : $("#hID").val()}, function(data)
{
doSomethingWithTotalSize( data.toString() );
});
function doSomethingWithTotalSize( totalSize )
{
// whatever
}
Otros consejos
Peter tiene toda la razón, pero puede forzar el método $ .ajax para que funcione sincrónicamente al pasar async: false
.
El problema es que está devolviendo i
fuera de la función de devolución de llamada. Básicamente, cuando devuelve i
, su contenido aún no existe y no existirá hasta que el servidor devuelva los datos a su función de devolución de llamada.
Prueba esto
function GetTotalSize(callback) {
$.post("Handlers/GetTotal.ashx", {id : $("#hID").val()}, function(outputData) {
callback(outputData);
});
}
function DoSomething(data)
{
//....
}
GetTotalSize(DoSomething);
Me doy cuenta de que esta es una publicación anterior, pero una solución para mí fue usar complete: [delegate]
en lugar de success
. Esto asegura que la devolución de llamada
esté completa.