jquery - вернуть значение из функции обратного вызова (в пост-запросе) в функцию, которая находится внутри? - PullRequest
3 голосов
/ 12 августа 2011

У меня есть функция javascript, которая отправляет данные в сценарий проверки и получает значение оттуда.Функция обратного вызова в запросе post возвращает логическое значение, и я пытаюсь получить функцию whole для возврата этого логического значения.Прямо сейчас функция обратного вызова возвращает правильное значение, но сама функция ничего не возвращает.Вот код:

function validate(request_type, request_text) {
    $.post("http://www.example.com/ajax/validate.php",{
        type: request_type, 
        text: request_text
    }, function(data) {
        return (data == "valid");
    });
}

Я понимаю, что это своего рода "синхронный" вызов, и это не то, чем занимается AJAX, но у меня уже есть множество функций в validate.php (вызовы базы данных и т. Д.).), что я не могу реализовать в Javascript, и я видел потоки типа этот , которые говорят об использовании какой-либо формы обработчика.

Как бы я написал простой обработчик, который сделает либопеременная data или результат логического сравнения data == "valid", доступный, когда я использую его в операторе if/else (где должна использоваться эта функция)?

РЕДАКТИРОВАТЬ: Например, одинif операторов, которые будут использовать логический результат:

if (!validate('password',pass_new)) {
        $('#pass_new').addClass('error');
        $('#pass_confirm_new').addClass('error');
        $(error_string.format('Please enter a valid password.')).insertAfter('#pass_confirm_new');
        $('#pass_text_short').hide();
        $('#pass_text_long').show();

РЕДАКТИРОВАТЬ: функция, вызванная с событием onsubmit в моей форме HTML:

function valid_pass_sett() {
    //code to remove errors left over from previous submissions - snipped
    pass_old = $('input[name=pass_old]').val();
    pass_new = $('input[name=pass_new]').val();
    pass_confirm_new = $('input[name=pass_confirm_new]').val();
    //some if statements that don't involve AJAX requests - snipped
    if (!validate('password',pass_new)) {
        $('#pass_new').addClass('error');
        $('#pass_confirm_new').addClass('error');
        $(error_string.format('Please enter a valid password.')).insertAfter('#pass_confirm_new');
        $('#pass_text_short').hide();
        $('#pass_text_long').show();
        return false;
    }

    return true;
}

У меня естьне редактировал этот код, чтобы включить обновленный код, который был опубликован, но у меня вопрос, как я return false от него, чтобы остановить отправку формы?

Ответы [ 4 ]

7 голосов
/ 12 августа 2011
function validate(request_type, request_text, callback) {
    $.post("http://www.example.com/ajax/validate.php",{
        type: request_type, 
        text: request_text
    }, function(data) {
        callback(data == "valid");
    });
}

И использование будет:

validate(request_type, request_text, function (isValid) {
    if(isValid) { 
        // do something
    } else {
        // do something if invalid
    }
});
4 голосов
/ 12 августа 2011

Если вы не сделаете синхронный AJAX-вызов (что вы, вероятно, не хотите делать), вы просто не сможете.

Если эта функция используется в нескольких местах в вашем коде, лучше всего разрешить ей получать функцию.

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

var my_form = $('#my_form');

my_form.submit( valid_pass_sett );

function valid_pass_sett() {
    //code to remove errors left over from previous submissions - snipped
    pass_old = $('input[name=pass_old]').val();
    pass_new = $('input[name=pass_new]').val();
    pass_confirm_new = $('input[name=pass_confirm_new]').val();

    validate('password', pass_new, pswd_validation_callback); // async validation

    return false;  // cancel form submission
}

function validate(request_type, request_text, callback ) {
    $.post("http://www.example.com/ajax/validate.php",{
        type: request_type, 
        text: request_text
    }, callback );
}

function pswd_validation_callback( data ) {
    if ( data === 'valid' ) {
         // if valid, call the native .submit() instead of the jQuery one
        my_form[ 0 ].submit();
    } else {
         // Otherwise do your thing for invalid passwords.
         // The form has already been canceled, so no concerns there.
        $('#pass_new').addClass('error');
        $('#pass_confirm_new').addClass('error');
        $(error_string.format('Please enter a valid password.')).insertAfter('#pass_confirm_new');
        $('#pass_text_short').hide();
        $('#pass_text_long').show();
    }
}

РЕДАКТИРОВАТЬ: Изменено использование кода, размещенного в вопросе.

РЕДАКТИРОВАТЬ: Обновление для работы с добавленным дополнительным кодом. Для ясности сужаю ответ до названной функции.

1 голос
/ 12 августа 2011
function validate(request_type, request_text) {
$.post("http://www.example.com/ajax/validate.php",{
    type: request_type, 
    text: request_text
}, function(data) {
    return (data == "valid");
}); }

Вы не можете действительно вернуться из 'проверки' результата вызова AJAX. Вы можете попытаться объявить переменную перед вызовом $ .post, назовем ее 'x', и внутри функции ответа присваиваем значение этой переменной (x = data == "valid") и за пределами блока $ .post, но внутри функции 'validate' верните это значение.

function validate(request_type, request_text) {
var x;
$.post("http://www.example.com/ajax/validate.php",{
    type: request_type, 
    text: request_text
}, function(data) {
    x = data == "valid";
});
return x; }

Реальная проблема заключается в том, что функция 'validate' будет продолжаться, даже если пост-вызов не вернул никакого значения, поэтому всегда будет 'false'.

Лучшее, что вы можете сделать, это вызвать другую функцию ВНУТРИ функции ответа, чтобы вы могли убедиться, что серверный вызов завершен, прежде чем перейти к следующей части.

Edit:

Прошло много времени с тех пор, как я отправил этот ответ. Мир изменился и AJAX звонит.

Теперь у нас есть обещаний ;)

Вы по-прежнему не можете вернуть прямое значение из функции, но вы можете вернуть объект Promise , который может быть связан с другим Promise , и второе обещание получит данные Вы вернулись из первого.

function validate(request_type, request_text) {

   var promise = $.ajax("http://www.example.com/ajax/validate.php",{
       type: request_type, 
      text: request_text
   });

function getStuff(data) {
    //Do something and return the data to the next promise
    return data;
}

promise.then(getStuff).then(function(data){
    // Do something else with data
});

}
0 голосов
/ 29 марта 2013

Если я правильно понимаю этот вопрос, вы можете достичь желаемого, просто сохранив возвращаемое значение в элемент HTML, а затем верните значение этого элемента из пользовательской функции:

    function validate(request_type, request_text){

       $.post("http://www.example.com/ajax/validate.php",{
          type: request_type, 
          text: request_text}, 
          function(data) {
             $('#someElement').text(data); 
          });

       //return the data by getting the value of the html element
       return $('#someElement').text();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...