Как вернуть значение при успешном запросе AJAX [дубликат]

этот вопрос уже есть ответ здесь:

   function ajaxRefresh(actionUrl) {
        $.ajax({
        url: actionUrl,
        success: function() {
             return true;
        }});
        return false;
    }

функция в любом случае возвращает false даже если запрос выполнен успешно, becouse запрос является асинхронным. Как я могу вернуться!--2--> когда запрос успешно?

6 ответов


вы должны установить параметр async to false. Попробуйте этот код:

function ajaxRefresh(actionUrl) {
    var succeed = false;

    $.ajax({
    async: false,
    url: actionUrl,
    success: function() {
         succeed = true;
    }});

    return succeed;
}

вы не можете вернуть "true", пока запросы ajax не закончатся, потому что это asynchron, как вы упомянули. Таким образом, функция сохраняется до завершения запроса ajax.

Решение 1

function ajaxRefresh(actionUrl, successCallback) {
    $.ajax({
       url: actionUrl,
       success: successcallback
    });
}

но есть обходной путь: просто добавьте параметр обратного вызова в функцию. Эта функция будет выполнена по завершении запроса.

решение 2

вы можете вернуть отложенный jquery.

function ajaxRefresh(actionUrl, successCallback) {
    return $.ajax({
       url: actionUrl
    });
}

Теперь вы можете использовать функции как:

function otherFunction()
{
     ajaxRefresh().success(function() {
        //The ajax refresh succeeded!
     }).error(function() {
        //There was an error!
     });
}

для получения дополнительной информации о jQuery deferreds посмотрите наhttp://www.erichynds.com/jquery/using-deferreds-in-jquery/.


вы можете выполнить рефакторинг кода немного, так что ваш успех обратного вызова срабатывает следующая операция, которая зависит от истинного/ложного результата. Например, если у вас есть что-то вроде:

function main() {
  // some code

  if (ajaxRefresh(url)) {
    // do something
  }
}

вы бы изменили это на что-то вроде:

function main() {
  // some code

  ajaxRefresh(url);
}

function doSomething(successFlag) {
  if (successFlag) {
    // do something
  }
}

function ajaxRefresh(actionUrl) {
  $.ajax({
         url: actionUrl,
         success: function() {
           doSomething(true); // or false as appropriate
         }});
}

вы также можете поставить if проверьте функцию обратного вызова ajax вместо . Вам решать.

или вы можете сделать синхронный запрос и выяснить ajaxRefresh() возвращаемое значение функции после выполнения запроса. Я бы не рекомендовал этого для большинства целей.


Я относительно новичок в этом, но вот предлагаемая работа, которую я придумал, которая устраняет необходимость устанавливать asynch в false или что-то в этом роде. Просто установите скрытое значение поля с результатом вызова ajax и вместо проверки возвращаемого значения проверьте значение скрытого поля на true / false (или что вы хотите в него поместить).

пример: сделать функция() {

    $.ajax({
        ...blah blah 
        },
        success: function(results) {
            if(results === 'true') {
                $('#hidField').val('true');
            }
            else {
                $('#hidField').val('false');
            }
        }
    });

тогда где-то еще, где это требуется, это doSomething вызывается функция, и вместо проверки результата вызова ajax найдите значение скрытого поля:

doSomething();

var theResult = $('#hidField').val();

if (theResult == 'true') {

...do whatever...

}

использовать функции обратного вызова

Очереди Функций Обратного Вызова: -

параметры beforeSend, error, dataFilter, success и complete принимают функции обратного вызова, которые вызываются в соответствующее время.

Так вот

function ajaxRefresh(actionUrl) {
        $.ajax({
        url: actionUrl,
        success: function() {
             return true;
        }
        error:function(){
             return false;
        }
     });        
    }

вы можете получить более подробную информацию здесь

http://api.jquery.com/jQuery.ajax/


function ajaxRefresh(actionUrl) {   
    bool isSucesss=false;
    $.ajax({       
        url: actionUrl,        
        success: function() {   
            isSucesss=true;     
        },
        error:function() {   
            isSucesss= false;     
        }
    });     
    return isSucesss;
}