我希望这个问题的标题有点清楚,我无法弄清楚如何准确地说出我的问题。基本上我有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返回该响应,但是其他对象也使用这个函数,所以我需要一种方法在每次使用后重置它。
答案 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()检查,以确保得到正确的答案。