2013-07-17 2 views
1

Я использовал проверку jquery для проверки электронной почты. Но переменная, значение которой изменено в функции успеха, недоступно вне ее. Это можно сделать с помощью async = false, но это уничтожает цель Ajax.Использовать переменную javascript вне функции успеха

Ниже приведен код:

$.validator.addMethod('verifyemail',function(value,element){   
    $.ajax({ 
     type: "POST", 
     url : $.app.urls('base_url')+'account/check_email', 
     data: {'email' : value}, 
     success: function(msg){ 
      //If email exists, set response to true 
      if(msg.status == 'false') 
       respond = false; 
      else 
       respond = true; 
     } 
    }) 
    console.log(respond); 
    return respond; 
}, "Email is Already Taken"); 
+0

__Problem: __ Попытка использовать неопределенную переменную. __Экспланирование: __ Запрос AJAX займет некоторое время, вы не можете прочитать результаты сразу после вызова $ .ajax. __Solution: __ Событие, управляемое потоком программы, отдельные методы проверки достоверности и запросы AJAX. Проверьте, что действительный и по умолчанию недействителен. –

ответ

4

Вы не можете установить значение в асинхронной функции, как, что , Способ, которым это работает, заключается в том, что значение respond будет установлено в значение. Затем ваш асинхронный вызов ajax погаснет, как только он погасит оставшуюся часть кода ниже вашего вызова ajax. Как только вызов ajax будет возвращен, код в обратном вызове будет выполнен. Скорее всего, к этому времени ваша функция валидатора завершит выполнение.

Поскольку вы используете этот вызов ajax в валидаторе, вы хотите запустить его последовательно, поскольку проверка зависит от результата вашего вызова ajax. Вы можете выполнить это, установив async: false.

Вот полезный ресурс на асинхронных обратных вызовов, и как они работают:

http://blog.parse.com/2013/01/29/whats-so-great-about-javascript-promises/

И другое покрытие JQuery в AJAX функции асинхронной против синхронизации:

http://net.tutsplus.com/tutorials/javascript-ajax/event-based-programming-what-async-has-over-sync/

+0

Я знаю об aync: false, но разве это не испортило бы использование Ajax? –

+0

Это только победит цель запуска функции асинхронно, но так как вам нужен результат запроса http для определения проверки, вам нужно запустить ее последовательно. – jrthib

+0

хорошо спасибо вам –

0

доступа к переменному Вам ответить нужно либо определить его в верхних рамках

$.validator.addMethod('verifyemail',function(value,element){   
    var respond = true; // scope of variable to current function 
    $.ajax({ 
     type: "POST", 
     url : $.app.urls('base_url')+'account/check_email', 
     async: false, 
     data: {'email' : value}, 
     success: function(msg){ 
      //If email exists, set response to true 
      if(msg.status == 'false') 
       respond = false; 
      else 
       respond = true; 
     } 
    }) 
    console.log(respond); 
    return respond; 
}, "Email is Already Taken"); 
+0

Все еще не работает –

+0

Хорошо, это проблема с асинхронной природой, пожалуйста, уточните обновленный ответ. –

+0

Благодарим за ответ –

1

Ajax вызов является асинхронным, значение, когда вы вызываете console.log (ответить); Ответ переменной по-прежнему недоступен. Если вам нужно получить доступ к нему за пределами функции успеха, вы можете запустить настраиваемое событие и получить ответ в обработчике событий.

И, конечно же, вы должны ответить на внешний вид.

+0

Пример, если это возможно, пожалуйста, –

+0

. Я думаю, что jquery.validator в основном предназначен для проверки на стороне клиента. Поскольку проверки формы выполняются как на стороне клиента, так и на стороне сервера, я предлагаю вам опубликовать (ajax) форму и показать возвращенную ошибку, если таковая имеется. Использование ajax в режиме синхронизации блокирует браузер, что создает плохую работу с пользователем. – NeoWang

+0

Это проблема, с которой я столкнулся сейчас –

0

respond уже глобальная переменная (отсутствие var ключевого слова), но асинхронный характер AJAX означает, что он не обязательно будет доступен, если следующие строки запуска, так что вы должны последовательно в одном из нескольких способов

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

Надежда, которая помогла

Смежные вопросы