从一个函数返回布尔值必须影响另一个函数

时间:2011-10-30 14:19:43

标签: javascript function

我希望这个问题的标题有点清楚,我无法弄清楚如何准确地说出我的问题。基本上我有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(用户名)来获取返回的true或false布尔值,并确定它是否需要显示正响应或否定响应。

功能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返回该响应,但是其他对象也使用这个函数,所以我需要一种方法在每次使用后重置它。

3 个答案:

答案 0 :(得分:1)

我认为最好的办法是删除函数A并将其逻辑放在函数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调用中返回值,因为您必须异步地创建它们,哪种方法会失败,或者必须在返回处理程序中处理您想要的逻辑,如上所示。

答案 1 :(得分:0)

异步执行的函数的返回值是无用的。您需要在回调中的validUsername 或回调调用的函数中执行您正在进行的工作。如上所述,您尝试使用checkData,就好像它是同步的一样,但它根本不是,因为它会发出异步HTTP请求。将工作转移到onreadystatechange回调可以解决您的问题。

答案 2 :(得分:0)

AJAX调用是异步的,因此函数checkData()立即返回,无需等待服务器答案。当答案到达时,它调用handleServerResponse()函数传递响应。

我建议你在handleServerResponse()中移动validUsername()检查,以确保得到正确的答案。