0

在我开始我的问题之前,请注意大部分代码都处于开发的早期阶段。因此,存在的许多东西只是为了提供用于测试目的的基本功能。因此,请只关注手头的问题。

无论如何,我有这个功能 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">&times;</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 数组未完成填充。因此,我收到“无法读取未定义的属性”错误。

因此,我只是想知道-如何在此代码中正确使用回调,以便在查询完成并填充数组之前不执行任何进一步的代码?提前致谢。

4

0 回答 0