我在适应 Node/js/TypeScript 的异步优先性质时遇到了困难。这个小函数的意图应该非常清楚:它需要一个数据库并返回该数据库中列出的类(class)数组。
问题是 return 语句在任何数据库操作运行之前运行,并且我得到一个空列表。当我在数据库 each
循环中设置断点时,我可以看到行被找到,并且类(class)被一一放入 ret
中,但这些类(class)永远不会在调用 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;
}
建议?
调用代码只是想打印有关类(class)的信息。例如:
let courses = courseList(db);
console.log(courses.length); // logs 0, even though the db contains courses
最佳答案
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);
});
更多
- 有更好的方法来写这个。使用 promise https://basarat.gitbooks.io/typescript/content/docs/promise.html
- 文档太糟糕了:https://github.com/mapbox/node-sqlite3/wiki我很想在其他地方(TS First)寻找数据库解决方案。对我个人来说,这不值得承受痛苦。 YMMV。
关于node.js - 同步运行 Node sqlite3代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43458921/