【发布时间】: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