2015-08-16 138 views
0

我有一個返回值的HTTPRequest。我用回調函數捕獲這樣的值。使用回調函數從異步請求返回值

如果用戶名在數據庫中重複,代碼將執行併發出警報。然而,「返回false」不起作用,並且表單無論如何都被提交(saveNewUser)與重複的用戶名。到目前爲止,我所見過的所有例子都只是在回調中停下來,就像在我的代碼中一樣。那麼如何實現返回false在其他情況下停止執行:首先,姓氏和密碼檢查?

非常感謝。

function checkUsername(callbackUsername){ 
    var username = document.getElementById('username_id').value; 
    var ajaxRequest = getXMLHttp(); 

      ajaxRequest.onreadystatechange = function() 
      { 
      if(ajaxRequest.readyState == 4 && ajaxRequest.status==200){ 
       var response = trim(ajaxRequest.responseText); 
       callbackUsername(response); 
      } 
      }; 
     var url = "../admin/check_unique_username.php";  
     var parameters = "username="+username; 
     ajaxRequest.open("POST", url, true); 
     ajaxRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");   
     ajaxRequest.send(parameters); 
    } 

function checkNewUserForm(){ 
    if(document.getElementById('first_name_id').value === ""){ 
     alert("First Name cannot be blank!"); 
     document.getElementById('first_name_id').focus(); 
     return false; 
    } 
    if(document.getElementById('last_name_id').value === ""){ 
     alert("Last Name cannot be blank!"); 
     document.getElementById('last_name_id').focus(); 
     return false; 
    } 
    checkUsername(function(result) { 
     if(result > 0){ 
     alert("ERROR: Username already exist. Please select a different username!!"); 
     document.getElementById('username_id').focus(); 
     return false; 
     } 
     }); 
    re = /[0-9]/; 
    if(!re.test(document.getElementById('password_id').value)) { 
     alert("Error: password must contain at least one number (0-9)!"); 
     document.getElementById('password_id').focus(); 
     return false; 
    } 
    saveNewUser(first_name,last_name,username,password); 
} 
+0

對於一個基本的用例,我只是用'checkUsername'函數包裝所有'checkNewUserForm'。然而,這也將是一個適當的地方使用承諾,其中有像https://github.com/kriskowal/q – Harangue

+0

Sheeeet,我寫出了一個完整的答案,然後它被標記爲重複:)這是我寫給你:http://www.vostok.xyz/32038674_answer.txt – Utkanos

+0

我剛剛找到了一個解決方案:將saveNewUser函數調用內部的checkUsername結果<0。它的工作,但它有沒有其他方式? –

回答

0

通過return false你只會從callback函數返回。您必須從checkNewUserForm()函數返回以停止保存新用戶。要發生這種情況,您可以使用boolean變量hasDuplicateUsername來檢查是否存在重複的用戶名條目,以便您可以在回調中將其設置爲true。在saveNewUser()之前,你應該檢查它是否是false

function checkNewUserForm(){ 
    var hasDuplicateUsername = false; 
    if(document.getElementById('first_name_id').value === ""){ 
     alert("First Name cannot be blank!"); 
     document.getElementById('first_name_id').focus(); 
     return false; 
    } 
    if(document.getElementById('last_name_id').value === ""){ 
     alert("Last Name cannot be blank!"); 
     document.getElementById('last_name_id').focus(); 
     return false; 
    } 
    checkUsername(function(result) { 
     if(result > 0){ 
     alert("ERROR: Username already exist. Please select a different username!!"); 
     document.getElementById('username_id').focus(); 
     hasDuplicateUsername = true; 
     } 
    }); 
    re = /[0-9]/; 
    if(!re.test(document.getElementById('password_id').value)) { 
     alert("Error: password must contain at least one number (0-9)!"); 
     document.getElementById('password_id').focus(); 
     return false; 
    } 
    if(!hasDuplicateUsername) { 
     saveNewUser(first_name,last_name,username,password); 
    } 
} 
+0

你好Tibzon.I試過那個,但是全局變量沒有從回調中更新。那是我嘗試的第一件事。 –

+0

這很奇怪。其實它應該按預期工作。你有沒有在'checkNewUserForm()'方法內定義'hasDuplicateUsername'變量?一個類似的事情[** here **](http://jsfiddle.net/arunatebel/0nct88fh/) – arunatebel

+0

其實我所做的是創建一個全局變量= 0(在checkNewUserForm之外)變量在if語句(= 1)和if中的警報也顯示變量正在更新(打印1)。然而,if語句之外的第二個警報打印爲0.這就是我所說的,它不會更新全局變量。我認爲這是因爲變量的異步狀態。內部變量在其他外部變量被更新之前,甚至認爲if語句之外的警報最後被調用,所存儲的值仍然是0。這就是我迷失的地方。 –