【问题标题】:Running node sqlite3 code synchronously同步运行 node sqlite3 代码
【发布时间】:2017-04-18 08:58:52
【问题描述】:

我无法适应 node / js / typescript 的异步优先性质。这个小函数的意图应该很清楚:它需要一个数据库并返回该数据库中列出的课程数组。

问题是返回语句在任何数据库操作运行之前运行,我得到一个空列表。当我在数据库each 循环中设置断点时,我可以看到正在找到行并且正在将课程一一放入ret,但是这些课程在courseList() 所在的范围内从未可见调用。

const courseList = (database: sqlite3.Database): Course[] => {
    let ret = new Array<Course>();

    database.serialize();
    database.each("select ID, Title from Course", (err: Error, row: Object) => {
        ret.push(new Course(
            row.ID,
            row.Title
        ))
    })

    return ret;
}

建议?

调用代码只想打印有关课程的信息。例如:

let courses = courseList(db);
console.log(courses.length); // logs 0, even though the db contains courses

【问题讨论】:

  • 这里的 NodeJS 没有什么特别之处,只是高阶函数,特别是回调。可以显示调用代码吗?
  • @AluanHaddad 添加了一些示例调用代码。
  • @NiloCK 您在其他地方有错误或您省略了代码。该功能确实有效。请参阅此处我有您的代码但使用模拟数据库jsbin.com/rixivofeke/1/edit?js,console 是的,存在竞争条件,但该函数返回一个值。它的行为不像你描述的那样。
  • @AluanHaddad 我想我搞混了。如果你是 VSCode 得心应手,这个 repo:www.github.com/nilock/lynda-copy-course 可以被构建/启动来演示行为。请参阅 /bin/lynda-copy-course.ts 的第 9-12 行,以及 /src/index.ts 的第 20-35 和 66-86 行

标签: node.js typescript sqlite


【解决方案1】:

database.each 接受一个完整的回调。使用它来恢复例如

const courseList = (database: sqlite3.Database, complete): Course[] => {
    let ret = new Array<Course>();

    database.serialize();
    database.each("select ID, Title from Course", (err: Error, row: Object) => {
        ret.push(new Course(
            row.ID,
            row.Title
        ))
    }, complete);

    return ret;
}
let courses = courseList(db, () => {
    console.log(courses.length); 
});

更多

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多