Sqlite ждать открытия базы данных - PullRequest
0 голосов
/ 01 декабря 2019

Я недавно начал использовать javascript и электрон. Я хочу использовать 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 ждать, пока база данных фактически не откроется. ? Из того, что я понял из моих чтений, мне нужно создать функцию обратного вызова, но я не смог сделать это успешно. И чем больше я читаю, тем больше путаюсь. Заранее спасибо.

1 Ответ

0 голосов
/ 01 декабря 2019
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);
  });
})

Если этот способ неуместен, тогда используйте обещание

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...