2011-10-30 44 views
0

我希望這個問題的標題是有點清楚,我不知道如何正確拼出我的問題。基本上我有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返回該響應,但其他對象也使用此函數,因此我需要在每次使用後重置它的方法。

回答

0

異步執行的函數的返回值是無用的。您需要在回調或回調函數中執行validUsername中的工作。正如所寫,你試圖使用checkData就好像它是同步的,但它從根本上不是,因爲它會產生一個異步的HTTP請求。將工作轉移到onreadystatechange回調可解決您的問題。

+0

我無法將工作轉移到handleServerResponse(),因爲函數A意圖確定當函數B返回true或false響應時應該採取什麼樣的動作。在某些情況下,它將顯示消息,但在其他情況下,它可能會有所不同。 – ryandlf

+0

@ryandlf - 不僅*你可以按照我的建議去做,它幾乎是*唯一的方式*。沒有什麼能夠阻止你在HTTP請求的回調中執行更復雜的邏輯。您不僅限於在那裏顯示消息。你需要反轉你的觀點。根據事件來思考。您啓動一個請求,然後在完成時處理結果。你*不*做的是啓動一個請求,然後將其結果返回到啓動它的相同函數。這是基本同步與異步思考。 –

+0

我必須給予您接受的答案,因爲您幫助我理解了其他方法不起作用的原因。謝謝。 – ryandlf

1

我認爲最好的方法是刪除功能的,並把函數C裏面的邏輯:

function handleServerResponse(container){ 
    var response = xmlObj.responseText; 
    if(xmlObj.readyState == 4) { 
    if(xmlObj.status == 200){ 
     if(response.indexOf('null') != -1){ 
      showMessage(username, true); 
     }else{ 
      showMessage(username, false, 'Username Already In Use'); 
     } 
    } 
    } 
} 

如果難以返回值從AJAX調用,因爲你要麼必須讓他們以異步方式,哪一種破壞目的,或者必須像上面顯示的那樣處理返回處理程序中的邏輯。

+0

這就是我現在設置的方式,但它不如我想要的那樣工作,因爲我需要能夠使用函數A來設置備用響應。這段代碼並不總是簡單地返回一個showMessage。函數A意味着確定它應該有什麼迴應。 – ryandlf

0

AJAX調用是異步的,因此函數checkData()立即返回,而不等待服務器的答案。當答案到達時,它會調用handleServerResponse()函數將響應傳遞給它。

我建議你移動handleServerResponse()中的validUsername()檢查以確保你得到正確的答案。