Função JavaScript com JQuery POST sempre retorna indefinido
-
05-07-2019 - |
Pergunta
Eu não tenho idéia o que está acontecendo aqui e estava esperando que alguém poderia ajudar, eu tenho certeza que é algo fácil acontecendo que eu estou em falta.
Eu tenho uma função em javascript que tem um posto dentro JQuery dele. Eu gostaria de retornar os resultados do post que é apenas texto e colocá-lo em uma variável. O número está voltando corretamente desde o post, mas quando eu colocá-lo na variável, a variável diz "indefinido". Alguma idéia?
var total = GetTotalSize();
alert(total);
function GetTotalSize(){
var i = "";
$.post("Handlers/GetTotal.ashx", {id : $("#hID").val()}, function(data){
i = data.toString();
return i;
});
}
Solução
Você não pode fazê-lo assim. Lembre-se, o "A" no meio de AJAX "Asynchronous". A função de retorno de chamada que você fornecer para $.post()
irá executar bem depois executa GetTotalSize()
e retornos.
Você precisa reestruturar seu código para acomodar isso. Eu não posso ser específico em minha recomendação porque eu não sei o que o resto de sua aparência código como, mas aqui é uma possibilidade.
$.post("Handlers/GetTotal.ashx", {id : $("#hID").val()}, function(data)
{
doSomethingWithTotalSize( data.toString() );
});
function doSomethingWithTotalSize( totalSize )
{
// whatever
}
Outras dicas
Peter é absolutamente certo, mas você pode forçar o método $ .ajax ao trabalho de forma síncrona, passando async: false
.
O problema é que você está retornando fora i
da função de retorno de chamada. Basicamente, quando você retornar i
, o seu conteúdo não existem ainda, e não existirá até que o servidor retorna os dados para a sua função de retorno.
Tente este
function GetTotalSize(callback) {
$.post("Handlers/GetTotal.ashx", {id : $("#hID").val()}, function(outputData) {
callback(outputData);
});
}
function DoSomething(data)
{
//....
}
GetTotalSize(DoSomething);
Sei que este é um cargo mais velho, mas uma solução para mim foi usar complete:[delegate]
em vez de success
. Isso garante que o callback
está completo.