Функция Javascript с JQuery POST всегда возвращает неопределенный

StackOverflow https://stackoverflow.com/questions/1400854

Вопрос

Я понятия не имею, что здесь происходит, и я надеялся, что кто-то может помочь, я уверен, что это просто, что я просто скучаю.

У меня есть функция в javascript, в которой есть пост JQuery. Я хотел бы вернуть результаты поста, который является просто текстом, и поместить его в переменную. Число возвращается из Post правильно, но когда я помещаю его в переменную, переменная говорит "undefined". Есть идеи?

var total = GetTotalSize();
alert(total);

function GetTotalSize(){
    var i = "";
    $.post("Handlers/GetTotal.ashx", {id : $("#hID").val()}, function(data){
        i = data.toString();
        return i;
    });
}
Это было полезно?

Решение

Вы не можете так делать. Помните, что " A " в AJAX означает «асинхронный». Функция обратного вызова, которую вы предоставляете для $. Post () , будет хорошо выполняться после выполнения и возврата GetTotalSize () .

Вам нужно будет реструктурировать свой код, чтобы учесть это. Я не могу быть конкретным в своей рекомендации, потому что я не знаю, как выглядит остальная часть вашего кода, но есть возможность.

$.post("Handlers/GetTotal.ashx", {id : $("#hID").val()}, function(data)
{
  doSomethingWithTotalSize( data.toString() );
});

function doSomethingWithTotalSize( totalSize )
{
  // whatever
}

Другие советы

Питер абсолютно прав, но вы можете заставить метод $ .ajax работать синхронно, передав async: false .

Проблема в том, что вы возвращаете i вне функции обратного вызова. По сути, когда вы возвращаете i , его содержимое еще не существует и не будет существовать, пока сервер не вернет данные вашей функции обратного вызова.

Попробуйте это

function GetTotalSize(callback) {    
  $.post("Handlers/GetTotal.ashx", {id : $("#hID").val()}, function(outputData) {
       callback(outputData);
    });
}

function DoSomething(data)
{
   //....
}

GetTotalSize(DoSomething);

Я понимаю, что это старая запись, но для меня было решение использовать complete: [делегат] , а не success . Это гарантирует, что обратный вызов завершен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top