我使用jquery验证来验证电子邮件。但是在其成功函数中改变其值的变量在其外部是不可访问的。它可以使用async = false来完成,但这会破坏Ajax的目的。
以下是代码:
$.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 :(得分:4)
您不能在这样的异步函数中设置该值。这种方法的工作方式是将respond
设置为一个值。然后你的异步ajax调用将触发,一旦它触发你的ajax调用下面的其余代码就会执行。一旦ajax调用返回,将执行成功回调中的代码。最有可能的是,此时验证器函数将完成执行。
由于您在验证程序中使用此ajax调用,因此您需要连续运行此函数,因为验证取决于您的ajax调用的结果。您可以通过设置async: false
来完成此操作。
以下是异步回调及其工作原理的有用资源:
http://blog.parse.com/2013/01/29/whats-so-great-about-javascript-promises/
另一个涉及jQuery的AJAX函数async vs sync:
http://net.tutsplus.com/tutorials/javascript-ajax/event-based-programming-what-async-has-over-sync/
答案 1 :(得分:1)
Ajax调用是异步的,这意味着当你调用时 的console.log(响应); 变量响应仍然不可用。如果需要在success函数之外访问它,可以触发自定义事件并在事件处理程序中获得响应。
当然,你必须在外部范围内作出回应。
答案 2 :(得分:0)
respond
已经是一个全局变量(缺少var
关键字),但AJAX的异步性质意味着当以下行运行时它不一定可用,所以你需要序列它以一种方式之一
while
循环,直到响应设置为止,但这可能是一个糟糕的解决方案。希望有所帮助
答案 3 :(得分:-1)
访问您需要的响应变量,在上部范围中定义它
$.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");