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

时间:2016-01-29 12:50:17

标签: javascript jquery ajax function asynchronous

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

function checkUsername(username,callback){
    $.ajax({
        url: '/check_username.php',
        type: 'post',
        data: {username: username},
        dataType: 'json',
        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');
};

问题

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

问题

我怎样才能确保代码等到AJAX请求(checkUsername函数)完全完成后再继续。

我有一个“部分”解决方案:当我在error = true中包装检查false / setTimeout的if-else语句时,它有效。问题是:多少毫秒?我希望尽可能快地拥有它。 500ms的?如果没有完成AJAX响应怎么办? 1000毫秒?那不是太长了吗?

我认为有一个更好的解决方案,而不是使用setTimeout。有人有想法吗?

6 个答案:

答案 0 :(得分:3)

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

目前您的上述代码 在javascript之上,无论你是否调用你的ajax,它总是被执行。所以把它放到其他函数中并在调用checkUsername()之后调用它。

function checkUsername(username,callback){
    $.ajax({
        url: '/check_username.php',
        type: 'post',
        data: {username: username},
        dataType: 'json',
        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;
    };
    alertMsg();
});

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

答案 1 :(得分:1)

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

  

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

答案 2 :(得分:1)

将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');
};

答案 3 :(得分:1)

我有同样的问题无法找到任何方法,但这对我有用。

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

答案 4 :(得分:0)

AJAX(以及JavaScript的许多其他功能)都是异步的,这意味着你不要等待某些事情发生,但是rater会告诉JavaScript什么时候发生什么事情。在你的例子中,你试图等待'直到AJAX-Request完成,但你应该做的是告诉JavaScript在请求完成时执行你的代码,这意味着,把代码放在回调中。

答案 5 :(得分:0)

  

即使您使用了AJAX的回调,也就是检查的方式   条件仍然是异步的..

checkUsername('abc',function(data){
    alermsg(data);
});

function alertmsg(data){
  !data?alert('username does not exist'):alert('username exists');
}