Как вернуть значение из анонимной функции в jquery - PullRequest
1 голос
/ 24 мая 2011
function test() {
    var flag1 = false;
    if ($('#field1').attr('value') || !$('#field1').attr('value')) {
        $.ajaxSetup({
            cache: false
        });
        $.getJSON("test_term.php", {
            'term1': $("#cde").attr('value'),
            'cd3': $("#cde3").attr('value')
        }, function(data) {
            if (data[0].stss == 'K') {
                var status = data[0].stss;
                flag1 = true;

            } else if (data[0].stss == 'U' || data[0].stss == '') {
                flag1 = false;
                return;
            }
        });
    }
    alert("ANonymous value" + flag1);
    return flag1;
}

Как я могу вернуть значение "flag1" из анонимной функции, используемой в getJson()? Он всегда возвращает false, на который ссылается сверху.

Ответы [ 3 ]

2 голосов
/ 24 мая 2011

Это невозможно, как вы пытаетесь.

Ajax-вызовы являются асинхронными, они возвращаются всякий раз, когда они готовы. Внутренняя функция, которую вы передали getJSON(), запускается хорошо после завершения внешней функции test().

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

1011 * Е.Г. *

function do something(flag) {
  // do something
}

function test() {
  if ($('#field1').attr('value') || !$('#field1').attr('value')) {
    $.ajaxSetup({
        cache: false
    });
    $.getJSON("test_term.php", {
        'term1': $("#cde").attr('value'),
        'cd3': $("#cde3").attr('value')
    }, function(data) {
        if (data[0].stss == 'K') {
            var status = data[0].stss;
            doSomething(true);
        } else if (data[0].stss == 'U' || data[0].stss == '') {
            doSomething(false);
        }
    });
  }
}
1 голос
/ 24 мая 2011

Проблема не в анонимной функции, а в ее асинхронном характере.

Этот метод является обратным вызовом, который выполняется после завершения запроса AJAX.

По этой причине ваш

alert("ANonymous value" + flag1);
return flag1;

будет выполняться перед обратным вызовом, поэтому flag1 еще не был изменен этим методом.

Вам нужно будет поместить все, что вы хотите, после того, как данные JSONизвлечено в методе обратного вызова.

0 голосов
/ 24 мая 2011

Обработчики обратного вызова не будут работать, пока не вернется вызов ajax, поэтому вы не можете гарантировать, что flag1 будет обновлен.У вас должна быть отдельная функция, которая вызывается для перехода к следующему шагу.

У вас также может быть проблема с переменной scope. Вы можете поместить объявление для flag1 над функцией, и оно будет глобальным..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...