关于websql查找返回值的问题

小弟想对websql进行简单的封装,然而select取值的时候返回值不知道如何取出来,求各位大神指点迷津。代码如下:
图片说明
<!DOCTYPE html>




<pre><code> var db = openDatabase(&#39;mydb&#39;, &#39;1.0&#39;, &#39;mydbname&#39;, 2097152); function query(sql){ db.transaction(function (tx) { tx.executeSql(sql); }); } function select(sql) { var sql1 = sql; db.transaction(function (tx,sql) { //创建表外面用双引号 tx.executeSql(sql1, [], function (a, results) { console.log(results) result = results; }) }); } var result = []; function selectall() { db.transaction(function (tx) { //创建表外面用双引号 tx.executeSql(&quot;select * from role&quot;, [], function (a, results) { for (i = 0; i &lt; results.rows.length; i++){ var what = results.rows.item(i); result.push(what); } console.log(result); }); }); console.log(result); return result; } &lt;/script&gt; </code></pre> <p></head><br> <body></p> <script> query("CREATE TABLE IF NOT EXISTS role ('id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,'name' TEXT,'hobby' TEXT,date timestamp not null default (datetime('now','localtime')))") query("insert into role(name,hobby) values('gouzi','wanshe')"); query("insert into role(name,hobby) values('gouzi','wanshe')"); console.log(selectall()); query("drop table if exists role");


参考GPT和自己的思路:

根据你的代码,你在select函数内部定义了一个名为result的数组,并在查询到结果后将其赋值为查询结果。但是,由于JavaScript的作用域规则,你在selectall函数中访问的result是在其外部定义的,所以在select函数中赋值的result对selectall函数来说是不可见的。

为了解决这个问题,你需要将result的定义和赋值操作移到selectall函数中,以便确保result的作用域可以正确地覆盖整个函数。同时,你需要将select函数返回的结果对象作为回调函数的参数进行处理,而不是将其赋值给一个外部变量。

下面是修改过的代码:

 var db = openDatabase('mydb', '1.0', 'mydbname', 2097152);
 function query(sql){
 db.transaction(function (tx) {
 tx.executeSql(sql);
 });
 }
 function select(sql, callback) {
 db.transaction(function (tx) {
 tx.executeSql(sql, [], function (tx, results) {
 callback(results);
 });
 });
 }
 function selectall() {
 var result = [];
 select("select * from role", function (results) {
 for (i = 0; i < results.rows.length; i++){
 var what = results.rows.item(i);
 result.push(what);
 }
 console.log(result);
 });
 return result;
 }
 query("CREATE TABLE IF NOT EXISTS role ('id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,'name' TEXT,'hobby' TEXT,date timestamp not null default (datetime('now','localtime')))")
 query("insert into role(name,hobby) values('gouzi','wanshe')");
 query("insert into role(name,hobby) values('gouzi','wanshe')");
 console.log(selectall());
 query("drop table if exists role");
</script>

在修改过的代码中,我们将select函数的结果用回调函数传递出去,在selectall函数内部定义了一个新的result数组,并在回调函数中将查询到的结果添加到该数组中。最后,我们在selectall函数中返回了该数组。