在我开始我的问题之前,请注意大部分代码都处于开发的早期阶段。因此,存在的许多东西只是为了提供用于测试目的的基本功能。因此,请只关注手头的问题。
无论如何,我有这个功能 loginUser ...
function loginUser()
{
var numRowsReturned;
var username = document.getElementById('login_username').value;
var password = document.getElementById('login_password').value;
var queryString = "SELECT COUNT(*) FROM User WHERE Username = '" + username + "' AND Password = '" + password + "'";
try
{
var rtn = grabData(queryString);
}
catch(e){alert(e);}
//setTimeout(function()
//{
numRowsReturned = rtn[0].values[0];
console.log(numRowsReturned);
//}, 4000);
if(numRowsReturned != 1)
{
var errorMsg = 'Our records do not match what you have entered. Please try again.';
var err = document.createElement("div");
err.setAttribute("class", "alert alert-danger fade in");
err.innerHTML = '<a href="#" class="close" data-dismiss="alert" aria-label="close">×</a><strong>Error!</strong> ' + errorMsg + '</a>';
document.getElementById("main_content").insertBefore(err, document.getElementById("main_content").firstChild);
}
else
{
queryString = "SELECT * FROM User WHERE Username = '" + username + "' AND Password = '" + password + "';";
try
{
var rtn = grabData(queryString);
}
catch(e){alert(e);}
}
}
其中获取用户的登录输入值并使用它们运行查询,返回具有该信息的帐户数。如果返回的计数为 1,它将调用函数 grabData,该函数在数据库中查询该帐户的所有相关登录信息并将其存储在 HTML 数组中。如果返回 1 以外的任何值,则会向用户抛出错误。这是抓取数据...
function grabData(queryString)
{
var db, reader, xhr, holder;
var xhr = new XMLHttpRequest();
xhr.onload = function()
{
var uIntArray = new Uint8Array(this.response);
db = new SQL.Database(uIntArray);
holder = db.exec(queryString);
console.log(holder);
};
xhr.onreadystatechange = function()
{
if(xhr.readyState == 4 && xhr.status == 200)
console.log('here!');
};
xhr.open("GET", "http://192.168.1.11:8080/pages/finalProj.db", true);
//xhr.setRequestHeader("Content-Type", "text/xml");
xhr.responseType = "arraybuffer";
xhr.send(null);
return holder;
}
使用我的代码,我能够连接到数据库并检索正确的数据。但是,当我尝试使用这些数据时,由于这部分代码是异步的,通常查询尚未完成或 HTML 数组未完成填充。因此,我收到“无法读取未定义的属性”错误。
因此,我只是想知道-如何在此代码中正确使用回调,以便在查询完成并填充数组之前不执行任何进一步的代码?提前致谢。