在成功函数外使用javascript变量

时间:2013-07-17 05:06:05

标签: javascript jquery ajax scope

我使用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");

4 个答案:

答案 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");