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;
    });
}
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top