Typescript Sqlite3获取所有promise解析列表

ercv8c1e  于 2023-06-23  发布在  SQLite
关注(0)|答案(1)|浏览(216)

我目前正在开发一个小型的看板应用程序,为我自己的目的和后端是基于typescript(我是一个新手在TS TBH)和一个简单的sqlite3数据库。因此,目前我试图从数据库中获取数据,我有很多问题与这些承诺返回。
一张table看起来像那样

CREATE TABLE "board" (
    "id"    INTEGER NOT NULL UNIQUE,
    "name"  TEXT NOT NULL UNIQUE,
    "position"  INTEGER NOT NULL UNIQUE,
    PRIMARY KEY("id")
)

我的问题是:

SELECT name FROM board ORDER BY position

所以现在我把这个字符串给我的异步函数,它返回一个promise,我试图从函数中得到一个董事会标题的列表-看起来像这样:

import { Database } from "sqlite3";



function dbQuery() {
const db = new Database('./data.sqlite3');

return new Promise( resolve => db.serialize(() => {
    var result = [];
    db.all("SELECT name FROM board ORDER BY position", (err, rows) => {
    rows.forEach(function (row) {
            //console.log(row['name']);
            result.push(row['name']);
        }); 
    });
    console.log(result);
    resolve(result);
})
)
}

async function testFunc() {
    let res = await dbQuery();
    console.log(res);
}

testFunc();

有人知道为什么数组res在末尾总是空的吗?注解语句console.log(row ['name ']打印出正确的数据…
SQLITE3使用纯JS可能更好吗?(也许使用更好的sqlite3或类似的东西与JS,而不是sqlite3与TS?)或者使用另一个数据库框架更好?
我像每一个TS Sqlite3文档一样搜索和阅读,但似乎TS和SQLite3并不是那么常见的组合。

2eafrhcq

2eafrhcq1#

您将立即(同步)调用resolve,而为您提供rows的回调将 * 稍后 * 运行,即:异步
也许你认为serialize会阻止JavaScript的执行,直到查询结果进来,但这不是它的工作方式:serialize()将立即返回。serialize的目的不是阻止JavaScript的执行,而是保证 "...一次最多只能有一个语句对象执行一个查询"(docs)。您仍然可以异步地获得结果。在您的示例中,使用serialize没有任何优势,因为您只执行一条SQL语句。
您应该在执行回调时调用resolve--给.all()的回调。所以把它移到那里。
其他评论:

  • 使用.map()代替.forEach() + .push()
  • 检查err参数,看看是否有错误,在这种情况下,拒绝带有错误的promise
  • 删除serialize Package 器。
function dbQuery() {
    const db = new Database('./data.sqlite3');

    return new Promise(resolve => 
        db.all("SELECT name FROM board ORDER BY position", (err, rows) =>
            err ? reject(err)
                : resolve(rows.map(row => row['name']))
        )
    );
}

相关问题