2

我使用 jquery 验证来验证电子邮件。但是在success函数中改变了值的变量在它之外是不可访问的。可以使用 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");
4

4 回答 4

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/

于 2013-07-17T05:15:43.027 回答
1

Ajax 调用是异步的,这意味着当您调用 console.log(respond); 变量响应仍然不可用。如果您需要在成功函数之外访问它,您可以触发自定义事件并在事件处理程序中获取响应。

当然,您必须将响应放在外部范围内。

于 2013-07-17T05:19:33.587 回答
0

respond已经是一个全局变量(缺少var关键字),但是 AJAX 的异步特性意味着它在以下行运行时不一定可用,因此您需要以几种方式之一对其进行排序

  • 使其同步(但问题排除了这一点)
  • 将响应代码放在同一个匿名函数中
  • 您也可以创建一个while循环,直到设置响应为止,但这可能是一个糟糕的解决方案。

希望有帮助

于 2014-02-14T01:07:21.487 回答
-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");
于 2013-07-17T05:10:05.037 回答