2016-01-29 127 views
2

我有以下代碼來檢查用戶名是否已經存在。它使用AJAX請求到另一個頁面,該頁面返回1(用戶名存在)或0(用戶名不存在)。讓代碼等待,直到完成AJAX請求

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,如果其他然後去else語句)。

問題

我怎樣才能確保代碼等待,直到AJAX請求(該checkUsername功能)完全才去任何進一步的完成。

我有一個「部分」解決方案:當我換行的if-else語句,在一個setTimeout檢查error = true/false,它的工作原理。問題是:多少毫秒?我想盡可能快地擁有它。 500ms的?如果AJAX響應沒有完成呢? 1000毫秒?這不是太長嗎?

我認爲比用setTimeout做這個更好。任何人有想法?

+2

這是異步的,你不能先用一個回調,然後下一行只是忽略回調並假設數據是可用的,它仍然異步 – adeneo

+0

嘗試檢查'的console.log(data.response) '和'console.log(typeof data.response)' –

+0

@adeneo這應該有效。這是一個不同的功能。 –

回答

0

AJAX(和JavaScript的其他許多功能)是異步的,這意味着你不會等待發生的事情,但評價者告訴JavaScript發生什麼事情時要做什麼。在你的例子中,你試圖等待,直到AJAX-Request完成,但是你應該做的是告訴JavaScript在請求完成時執行你的代碼,這意味着把代碼放在回調中。

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

目前你上面的代碼 是於JavaScript之上,它總是被執行不管你打電話給你的AJAX或not.so放入其他函數和調用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'); 
} 
} 
0

即使你已經使用回調AJAX,你正在檢查 條件的方式仍是異步..

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

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

嘗試用異步:Ajax的功能虛假

異步(默認值:true) 類型:布爾型 通過def所有請求都是異步發送的(即,默認設置爲true)。如果您需要同步請求,請將此選項設置爲false。跨域請求和dataType:「jsonp」請求不支持同步操作。請注意,同步請求可能會暫時鎖定瀏覽器,並在請求處於活動狀態時禁用任何操作。從jQuery 1.8起,不贊成使用帶有jqXHR($ .Deferred)的async:false;您必須使用成功/錯誤/完整回調選項,而不是jqXHR對象的相應方法,例如jqXHR.done()或已棄用的jqXHR.success()。

+0

你甚至讀過你引用的文字嗎?它表示異步已棄用,不應使用。 – Stian

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

沒有人應該使用它,這是btw不贊成使用 –

1

我有同樣的問題找不到任何方式,但這對我工作。

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