Функция размытия Jquery: запустить вторую функцию после первой. Как? - PullRequest
0 голосов
/ 01 октября 2011

Я пытаюсь запустить вторую функцию, основываясь на результатах первой.

$('#email').blur(function () {

id = $(this).attr('id');
$(myObj).data(id,""); 

is_email(id); // If it's a valid email, it does this: $(myObj).data(id,"ok");

// Now if it's a valid email address, I want to run a second function to see if
// it's already taken.

if ($(myObj).data("email") == "ok") {

    $(myObj).data("email",""); // Resets the value...
    is_taken(id, "employees", "email"); // To test it again...

}   

});

Первая часть работает нормально, но когда я добираюсь до if ($ (myObj) .... никогда не проверяется. Я предполагаю, потому что это установлено для того же события размытия. IЯ подумал, поместив его ПОСЛЕ первой функции, он будет проверять значение этого объекта после завершения первой функции. Я предполагаю, что он проверяет, является ли значение «в порядке», прежде чем первая функция сможет вернуть значение.

1 Ответ

1 голос
/ 01 октября 2011

Поскольку функции используют AJAX, вторая вызывается до того, как первый вызов AJAX вернется и установит значение данных.Ключевая буква в AJAX - это первая буква «А» - асинхронная, что означает, что поток кода продолжается, не дожидаясь ответа.Вы можете избежать этого (и не использовать data для хранения промежуточных результатов), изменив функцию is_email на прием обратного вызова.Запустите вторую функцию как обратный вызов, когда вызов AJAX завершится в зависимости от результата первого вызова.

function is_email( id, type, check, callback )
{
     var that = this;
     $.post( '/email/check', $('#'+id).val(), function(result) {
           if (result == 'ok') {
                if (callback) {
                   callback.call(that,id,type,check);
                }
           }
     }
}

Используется как:

is_email(id, "employees", "email", istaken);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...