我希望這個問題的標題是有點清楚,我不知道如何正確拼出我的問題。基本上我有3個功能。返回布爾值從一個函數必須影響另一個
功能A:
function validUsername(){
if(username.element.value.length > 0){
if(checkData(username)){
showMessage(username, true);
}else{
showMessage(username, false, 'Username Already In Use');
}
}
}
基本上這個字段是使用AJAX來驗證用戶名已經不存在於數據庫中。它使用checkData(username)來獲取返回的真或假布爾值,並確定它是否需要顯示肯定或否定響應。
函數B(checkData(用戶名)):
function checkData(obj){
var field = getFieldValue(obj.container);
if(field.length != 1){
field = null;
}
if(xmlObj != null) {
xmlObj.open("POST", obj.servletUrl, true);
xmlObj.onreadystatechange = function() { handleServerResponse(obj.container); };
xmlObj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xmlObj.send("field=" + field); //Post username to Servlet
}
}
這是負責創建AJAX請求等。當該請求是準備是使用handleServerResponse顯示消息回到屏幕。
函數C(handleServerResponse):
function handleServerResponse(container){
var response = xmlObj.responseText;
if(xmlObj.readyState == 4) {
if(xmlObj.status == 200){
if(response.indexOf('null') != -1){
return true;
}else{
return false;
}
}
}
}
函數C返回一個布爾值,但我怎麼也返回布爾值回功能B,使函數A可以接收響應?我曾嘗試過:
xmlObj.onreadystatechange = function() { return handleServerResponse(obj.container);
return xmlObj.onreadystatechange; //Function B would return this.
但它無法正常工作。我也想過設置一個類似serverResponse = true的全局變量,然後從函數B返回該響應,但其他對象也使用此函數,因此我需要在每次使用後重置它的方法。
我無法將工作轉移到handleServerResponse(),因爲函數A意圖確定當函數B返回true或false響應時應該採取什麼樣的動作。在某些情況下,它將顯示消息,但在其他情況下,它可能會有所不同。 – ryandlf
@ryandlf - 不僅*你可以按照我的建議去做,它幾乎是*唯一的方式*。沒有什麼能夠阻止你在HTTP請求的回調中執行更復雜的邏輯。您不僅限於在那裏顯示消息。你需要反轉你的觀點。根據事件來思考。您啓動一個請求,然後在完成時處理結果。你*不*做的是啓動一個請求,然後將其結果返回到啓動它的相同函數。這是基本同步與異步思考。 –
我必須給予您接受的答案,因爲您幫助我理解了其他方法不起作用的原因。謝謝。 – ryandlf