Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Возврат функции значения из getJSON (https://javascript.ru/forum/events/17185-vozvrat-funkcii-znacheniya-iz-getjson.html)

Nycs 09.05.2011 17:45

Возврат функции значения из getJSON
 
Добрый день. Столкнулся со следующей проблемой:

Есть функция
function emailCheck(value) {
    if (check_email_address(value)) { //проверка по регулярным выр-ям
        $.getJSON("/ajax/check_email.php",{'email':value},function(json){
            if (json.success) {
                if ($("span.email").hasClass('bad')) {
                    $("span.email").removeClass('bad');
                }
                $("span.email").addClass('good');
                return true;  // это и надо вернуть. Пункт 1
            }
            else {
                if ($("span.email").hasClass('good')) {
                    $("span.email").removeClass('good');
                }
                $("span.email").addClass('bad');
                return false;  // или это. Пункт 2
            }
        });
    }
    else {
        if ($("span.email").hasClass('good')) {
            $("span.email").removeClass('good');
        }
        $("span.email").addClass('bad');
        return false;
    }
}


В коментариях в коде я пометил пункт 1 и 2, эти значения должна возвращать функция emailCheck(). Но дело в том что отправка\прием json это внутренняя функция и пункт 1 и 2 возвращают значение из этой внутренней функции. Пробовал писать return непосредственно перед $.getJSON()... - тоже без результатно...

Для передачи общей картины скажу что дальше в коде есть ивент на сабмит формы, и в теле этого сабмита есть строка
if (!emailCheck($("input.input1[name=email]").val())) { return false; }

То есть если emailCheck() возвращает false то прерывается отправка формы.

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

Starkua 09.05.2011 17:58

Дело в том, что Ajax запросы выполняются асинхронно. Другими словами, отдельным потоком, и true|false возвращаются не в функциу emailCheck.

Nycs 09.05.2011 18:01

Про асинхронность это я знаю... Видимо придется заводить глобальные переменные. Другого варианта я не нашел пока(

Starkua 09.05.2011 18:05

Нужно всегда стараться избегать глобальных переменных. Тем более, в этом случае, прийдется делать таймер, который будет ждать когда сервер вернет ответ? Вариант неправильный.
Сделай все проверки в одной функции, к примеру do_check_email()
Ее вызывай, после прихода данных с сервера, и уже там, можно продолжать все остальные вычисления.

Nycs 09.05.2011 18:08

Спасибо, пойду пробовать!!)

Nycs 09.05.2011 18:58

Не получается..(
Может я глобально мыслю не в ту сторону.. но есть отлов сабмита формы и в нем происходит проверка. Как мне дождаться всех джейсонов и аяксов и только потом, в случае успеха отправить форму. Таймер - это не дело.

$("#rgf").submit(function(){  // <form id="rgf" ...>...</form
        if (!emailCheck($("input.input1[name=email]").val())) { alert("bad 1"); return false; }
        if (!passCheck($("input.input1[name=pass1]").val(), $("input.input1[name=pass2]").val())) { alert("bad 2"); return false; } // тут нет аяксов
        if (!capCheck()) { alert("bad 3"); return false; }
    });


E-mail и капча проверяются аяксом и в случае отрицательного результата отправка формы должна прерваться. Подскажите пожалуйста как это реализовать. Спасибо.

Nycs 09.05.2011 19:43

Проблему решил... судя по коду - очень сильно через то самое место.. но иначе не придумал как.
В начале функции которая реагирует на сабмит формы вставил event.preventDefault(); затем провел все проверки, при чем каждая последующая проверка запускается из тела функции предыдущей проверки при успешном проходе. Так я добрался до финиша проверок. Там я мечу форму как "хорошую" ( $("#form_id").attr('valid', '1'); ) и еще раз вручную запускаю сабмит ( $(".reg_form").submit(); ). Фокус в том что перед вызовом первой валидаторской функции я проверяю наличие атрибута valid и его равенство единице. И если такое имеется - то форма уже отправляется без остановки и валидации...

Сильно не кидайтесь помидорами... если узнаю вариант получше - возьму его.


Часовой пояс GMT +3, время: 20:31.