【问题标题】:Use javascript variable outside success function在成功函数之外使用 javascript 变量
【发布时间】:2013-07-17 05:06:05
【问题描述】:

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

【问题讨论】:

  • 问题: 试图使用未定义的变量。 说明: AJAX 请求需要一些时间,在 $.ajax 调用后您无法立即读取结果。 解决方案: 事件驱动的程序流、单独的验证器方法和 AJAX 请求。检查有效,默认为无效。

标签: javascript jquery ajax scope


【解决方案1】:

您不能在这样的异步函数中设置值。它的工作方式是将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/

【讨论】:

  • 我知道 aync:false,但这不会破坏 Ajax 的使用吗?
  • 它只会违背异步运行函数的目的,但是由于需要http请求的结果来确定验证,所以需要串联运行。
  • 欢迎详细了解所需的一切
  • async:false 停止所有其他验证,怎么办?
  • 您能在 jsfiddle.net 之类的网站上发布更多代码示例吗?如果我能看到验证器,我可能会为您提供更多帮助
【解决方案2】:

Ajax 调用是异步的,也就是说当你调用 控制台.log(响应); 变量响应仍然不可用。如果你需要在success函数之外访问它,你可以触发一个自定义事件并在事件处理程序中得到响应。

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

【讨论】:

  • 请举例说明
  • 我认为 jquery.validator 主要用于客户端验证。由于表单验证是在客户端和服务器端完成的,我建议您发布(ajax)表单并显示返回的错误(如果有)。在同步模式下使用 ajax 会锁定浏览器,给用户带来不好的体验。
  • 这就是我刚才遇到的问题
  • 如果不使用 jquery.validator 没有问题。这就是我要说的。
  • 但这是主要要求
【解决方案3】:

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

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

希望有所帮助

【讨论】:

    【解决方案4】:

    要访问响应变量,您需要在上层范围内定义它

    $.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");
    

    【讨论】:

    • 好的,异步性质有问题,请检查更新的答案
    • @jrthib 在您指出异步性质之前已经给出了答案。所以我在那里打勾。
    • -1 用于切换到同步模式而不是尝试解决主要问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-21
    • 1970-01-01
    相关资源
    最近更新 更多