我最近开始使用javascript和electronic。我想使用sqlite作为数据库技术。我的问题是当我打电话给:
OpenDB(dbPath);
CreateTable("sampleTable", "Column1 TEXT NOT NULL, Column2 TEXT NOT NULL");
程序实际上在不等待数据库打开的情况下调用CreateTable函数。 如果我使用延迟程序调用这两个函数,将按预期工作。我在下面编写了函数定义:
export function OpenDB(dbPath) {
projectDB = new sqlite3.Database(dbPath, (err) => {
if (err) {
console.error(err.message)
this.result = false;
return;
}
console.log('SQlite project database created.');
});
}
export function CreateTable(tableName, tableColumns) {
configDB.run('CREATE TABLE IF NOT EXISTS ' + tableName + ' (' + tableColumns + ')' , (err) => {
if(err) {
console.error(err);
console.log("Table couldn't created.")
return;
}
console.log("Table created.")
})
}
所以,我的问题是如何使CreateTable函数等待数据库实际打开?从我的阅读中可以理解,我需要创建回调函数,但是我无法成功完成它。而且我读的更多我更困惑。预先感谢。
let db;
export function OpenDB(dbPath, cb) {
db = new sqlite3.Database(dbPath, cb);
}
export function CreateTable(tableName, tableColumns, cb) {
db.run('CREATE TABLE IF NOT EXISTS ' + tableName + ' (' + tableColumns + ')', cb);
}
并且欢迎回调地狱
OpenDb(dpPath, function (err) {
if (err)
return console.error(err.message);
CreateTable("sampleTable", "Column1 TEXT NOT NULL, Column2 TEXT NOT NULL", function (err) {
if (err)
return console.error(err);
});
})
如果这种方式不合适,则使用promisification
let db;
export function OpenDB(dbPath) {
return new Promise(function (resolve, reject) {
db = new sqlite3.Database(dbPath, err => err ? resolve() : reject(err));
});
}
export function CreateTable(tableName, tableColumns) {
return new Promise(function (resolve, reject) {
db.run('CREATE TABLE IF NOT EXISTS ' + tableName + ' (' + tableColumns + ')',
err => err ? resolve() : reject(err));
});
}
和用法
OpenDb(dbPath)
.then(() => CreateTable("sampleTable", "Column1 TEXT NOT NULL, Column2 TEXT NOT NULL"))
.then(() => CreateTable("sampleTable2", "Column1 TEXT NOT NULL, Column2 TEXT NOT NULL"))
.then(() => console.log('Complete'))
.catch(err => console.error(err));