使用jQuery$.ajax的Javascript范围查询
我试图编写一个简单的函数来检查数据库中是否存在设计器名称。我正在使用jQuery的ajax函数来尝试这样做:使用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
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查询完成之前返回。