Javascript 让代码等待,直到AJAX请求完成

Javascript 让代码等待,直到AJAX请求完成,javascript,jquery,ajax,function,asynchronous,Javascript,Jquery,Ajax,Function,Asynchronous,我有下面的代码来检查用户名是否已经存在。它对另一个页面使用AJAX请求,该页面返回1(用户名存在)或0(用户名不存在) 问题 代码检查是error=true(存在错误,即用户名存在)还是error=false,但代码会继续运行。它不会等到checkUsername中的AJAX请求完成。所以它总是“username exists”(因为error=undefined,if-else则转到else语句) 问题 如何确保代码等待AJAX请求(checkUsername函数)完成后再继续 我有一个“部分

我有下面的代码来检查用户名是否已经存在。它对另一个页面使用AJAX请求,该页面返回1(用户名存在)或0(用户名不存在)

问题

代码检查是
error=true
(存在错误,即用户名存在)还是
error=false
,但代码会继续运行。它不会等到
checkUsername
中的AJAX请求完成。所以它总是“username exists”(因为
error=undefined
,if-else则转到else语句)

问题

如何确保代码等待AJAX请求(checkUsername
函数)完成后再继续

我有一个“部分”解决方案:当我在
setTimeout
中包装检查
error=true
/
false
的if-else语句时,它会起作用。问题是:多少毫秒?我想尽快得到它。500毫秒?如果AJAX响应没有完成呢?1000毫秒?那不是太长了吗

我认为有一个比使用
setTimeout
更好的解决方案。有人有什么想法吗?

AJAX(以及JavaScript的许多其他功能)是异步工作的,这意味着您不必等待事情发生,而是告诉JavaScript当事情发生时该做什么。在您的示例中,您试图等待AJAX请求完成,但您应该做的是告诉JavaScript在请求完成时执行您的代码,这意味着,将代码放入回调中

if(error == false){
    alert('username does not exist');
}else{
    alert('username exists');
};
目前你的上述代码 它位于javascript之上,无论您是否调用ajax,它都会被执行。因此,将它放入其他函数中,并在调用checkUsername()后调用它

尽管您已经使用了AJAX回调,但是您检查的方式 条件仍然是异步的


在ajax函数上尝试使用async:false

异步(默认值:true) 类型:布尔型 默认情况下,所有请求都是异步发送的(即,默认情况下设置为true)。如果需要同步请求,请将此选项设置为false。跨域请求和数据类型:“jsonp”请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,从而在请求处于活动状态时禁用任何操作。从jQuery1.8开始,不推荐在jqXHR($.Deferred)中使用async:false;您必须使用success/error/complete回调选项,而不是jqXHR对象的相应方法,例如jqXHR.done()或不推荐使用的jqXHR.success()


将async设置为FALSE,它将在ajax请求完成之前不会移动

function checkUsername(username,callback){
    $.ajax({
        url: '/check_username.php',
        type: 'post',
        data: {username: username},
        dataType: 'json',
        async : false,
        success : function(data){
            switch(data.response){
                case 0:
                    callback(true);
                break;
                case 1:
                    callback(false);
                break;
            }
        }
    });                 
};

var error;  // 'undefined' for now

checkUsername('abc',function(data){
    if(data == false){
        // username exists
        error = true;
    }else{
        // username does not exist
        error = false;
    };
});

if(error == false){
    alert('username does not exist');
}else{
    alert('username exists');
};

我也有同样的问题,但我找不到任何方法,但这对我来说很有效

function sendAjax(){
var defObj = $.Deferred();
//my ajax code here  
defObj.resolve(ajaxResponse);
return defObj.promise();
}

它是异步的,您不能先使用回调,然后在下一行忽略回调并假设数据可用,它仍然是异步的。请尝试检查
console.log(data.response)
console.log(typeof data.response)
@adeneo,这应该可以工作。这是一个不同的函数。Q:让代码等待,直到AJAX请求完成-a:set async:false^不是吗
async:false
?任何人都不应该使用它,顺便说一句,这是不推荐的。您甚至阅读了您引用的文本吗?它说async已被弃用,不应使用。
checkUsername('abc',function(data){
    alermsg(data);
});

function alertmsg(data){
  !data?alert('username does not exist'):alert('username exists');
}
function checkUsername(username,callback){
    $.ajax({
        url: '/check_username.php',
        type: 'post',
        data: {username: username},
        dataType: 'json',
        async : false,
        success : function(data){
            switch(data.response){
                case 0:
                    callback(true);
                break;
                case 1:
                    callback(false);
                break;
            }
        }
    });                 
};

var error;  // 'undefined' for now

checkUsername('abc',function(data){
    if(data == false){
        // username exists
        error = true;
    }else{
        // username does not exist
        error = false;
    };
});

if(error == false){
    alert('username does not exist');
}else{
    alert('username exists');
};
function sendAjax(){
var defObj = $.Deferred();
//my ajax code here  
defObj.resolve(ajaxResponse);
return defObj.promise();
}