使用jQuery$.ajax的Javascript范围查询

使用jQuery$.ajax的Javascript范围查询,javascript,jquery,ajax,Javascript,Jquery,Ajax,我试图编写一个简单的函数来检查数据库中是否存在设计器名称。我正在使用jQuery的ajax函数来尝试这样做: function checkDesignerName(name) { var designer_name = $('input[name="name"]').val(); var designer_exists = false; var temp = $.ajax( { type: "GET", url: "/api/check

我试图编写一个简单的函数来检查数据库中是否存在设计器名称。我正在使用jQuery的ajax函数来尝试这样做:

function checkDesignerName(name)
{   
    var designer_name = $('input[name="name"]').val();
    var designer_exists =  false;
    var temp = $.ajax( { type: "GET", 
             url: "/api/check_brand_exists/", 
             data : {name : designer_name }, 
             success: function(data) {
                    designer_exists = $.parseJSON(data);
                    return designer_exists;
                }}).statusText;
    return designer_exists;
}
我已经阅读了有关javascript作用域的内容,但似乎仍然找不到我的bug,即checkDesignerName总是返回false。我是否需要使用闭包才能使此函数正常工作


谢谢

AJAX的本质是异步的,您似乎很难理解它

现阶段:

return designer_exists;
您的AJAX调用尚未完成。只有在稍后发生的成功回调中,才能使用结果。您不能有一个返回某些结果的函数,而这个结果取决于AJAX调用。您只能在成功回调中利用AJAX调用的结果:

function checkDesignerName(name)
{   
    var designer_name = $('input[name="name"]').val();
    $.ajax({ 
        type: "GET", 
        url: "/api/check_brand_exists/", 
        data : { name : designer_name }, 
        success: function(data) {
            var designer_exists = $.parseJSON(data);
            // Here and only here you know whether this designer exists
            alert(designer_exists);
        }
    });
}
当然,您可以执行对服务器的同步调用,这是完全不推荐的,因为通过设置
async:false
标志,它将冻结客户端浏览器,并在AJAX请求期间让用户离开您的站点:

function checkDesignerName(name)
{   
    var designer_name = $('input[name="name"]').val();
    var designer_exists = false;
    $.ajax({ 
        type: "GET", 
        url: "/api/check_brand_exists/", 
        async: false,
        data : { name : designer_name }, 
        success: function(data) {
            designer_exists = $.parseJSON(data);
        }
    });
    return designer_exists;
}
我提到这一点只是为了答案的完整性,而不是作为你们应该做的事情


现在,因为您似乎正在执行某种验证逻辑,所以我建议您使用以下方法作为最终解决方案:验证逻辑。它有很好的支持,可以完全满足您的需要。

AJAX的本质是异步的,您似乎很难理解它

现阶段:

return designer_exists;
您的AJAX调用尚未完成。只有在稍后发生的成功回调中,才能使用结果。您不能有一个返回某些结果的函数,而这个结果取决于AJAX调用。您只能在成功回调中利用AJAX调用的结果:

function checkDesignerName(name)
{   
    var designer_name = $('input[name="name"]').val();
    $.ajax({ 
        type: "GET", 
        url: "/api/check_brand_exists/", 
        data : { name : designer_name }, 
        success: function(data) {
            var designer_exists = $.parseJSON(data);
            // Here and only here you know whether this designer exists
            alert(designer_exists);
        }
    });
}
当然,您可以执行对服务器的同步调用,这是完全不推荐的,因为通过设置
async:false
标志,它将冻结客户端浏览器,并在AJAX请求期间让用户离开您的站点:

function checkDesignerName(name)
{   
    var designer_name = $('input[name="name"]').val();
    var designer_exists = false;
    $.ajax({ 
        type: "GET", 
        url: "/api/check_brand_exists/", 
        async: false,
        data : { name : designer_name }, 
        success: function(data) {
            designer_exists = $.parseJSON(data);
        }
    });
    return designer_exists;
}
我提到这一点只是为了答案的完整性,而不是作为你们应该做的事情


现在,因为您似乎正在执行某种验证逻辑,所以我建议您使用以下方法作为最终解决方案:验证逻辑。它有很好的支持,可以完全满足您的需要。

$。ajax是一种异步调用。这意味着即使在执行success函数之前,语句return designer_exists也会被执行。这就是它总是返回false的原因

$。ajax是一种异步调用。这意味着即使在执行success函数之前,语句return designer_exists也会被执行。这就是它总是返回false的原因

  • 成功函数没有看到设计器_存在变量
  • 返回操作在成功函数运行之前运行
  • 您可以运行同步请求或重新设计代码来回调逻辑

    对于同步请求,您的代码将为:

    var designer_exists =  false;
    function checkDesignerName(name)
    {   
        designer_exists =  false;
        var designer_name = $('input[name="name"]').val();
        $.ajax( { async:false,
                 type: "GET", 
                 url: "/api/check_brand_exists/", 
                 data : {name : designer_name }, 
                 success: function(data) {
                        designer_exists = $.parseJSON(data);
                    }}).statusText;
        return designer_exists;
    }
    
  • 成功函数没有看到设计器_存在变量
  • 返回操作在成功函数运行之前运行
  • 您可以运行同步请求或重新设计代码来回调逻辑

    对于同步请求,您的代码将为:

    var designer_exists =  false;
    function checkDesignerName(name)
    {   
        designer_exists =  false;
        var designer_name = $('input[name="name"]').val();
        $.ajax( { async:false,
                 type: "GET", 
                 url: "/api/check_brand_exists/", 
                 data : {name : designer_name }, 
                 success: function(data) {
                        designer_exists = $.parseJSON(data);
                    }}).statusText;
        return designer_exists;
    }
    

    正如Dimitrov正确指出的,它是异步的。如果希望将ajax调用封装在函数中,可以传入成功回调

    函数checkDesignerName(名称,successCallback)


    然后将其分配给jQuery ajax成功函数。

    正如Dimitrov正确指出的那样,它是异步的。如果希望将ajax调用封装在函数中,可以传入成功回调

    函数checkDesignerName(名称,successCallback)


    然后将其分配给jQuery ajax success函数。

    该函数将在ajax查询完成之前返回。该函数将在ajax查询完成之前返回。