Возврат функции значения из 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. Если ничего не получится то планирую завести просто глобальную переменную которую менять с помощью этой функции и далее проверять уже значение самой переменной.. но у меня три подобных независимых проверки, хотелось бы поэлегантнее... |
Дело в том, что Ajax запросы выполняются асинхронно. Другими словами, отдельным потоком, и true|false возвращаются не в функциу emailCheck.
|
Про асинхронность это я знаю... Видимо придется заводить глобальные переменные. Другого варианта я не нашел пока(
|
Нужно всегда стараться избегать глобальных переменных. Тем более, в этом случае, прийдется делать таймер, который будет ждать когда сервер вернет ответ? Вариант неправильный.
Сделай все проверки в одной функции, к примеру do_check_email() Ее вызывай, после прихода данных с сервера, и уже там, можно продолжать все остальные вычисления. |
Спасибо, пойду пробовать!!)
|
Не получается..(
Может я глобально мыслю не в ту сторону.. но есть отлов сабмита формы и в нем происходит проверка. Как мне дождаться всех джейсонов и аяксов и только потом, в случае успеха отправить форму. Таймер - это не дело. $("#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 и капча проверяются аяксом и в случае отрицательного результата отправка формы должна прерваться. Подскажите пожалуйста как это реализовать. Спасибо. |
Проблему решил... судя по коду - очень сильно через то самое место.. но иначе не придумал как.
В начале функции которая реагирует на сабмит формы вставил event.preventDefault(); затем провел все проверки, при чем каждая последующая проверка запускается из тела функции предыдущей проверки при успешном проходе. Так я добрался до финиша проверок. Там я мечу форму как "хорошую" ( $("#form_id").attr('valid', '1'); ) и еще раз вручную запускаю сабмит ( $(".reg_form").submit(); ). Фокус в том что перед вызовом первой валидаторской функции я проверяю наличие атрибута valid и его равенство единице. И если такое имеется - то форма уже отправляется без остановки и валидации... Сильно не кидайтесь помидорами... если узнаю вариант получше - возьму его. |
Часовой пояс GMT +3, время: 20:33. |