如何同步Node.js函数

时间:2019-11-30 10:45:06

标签: javascript node.js sqlite

我正在使用NodeJs服务器,并且正在实现Sqlite3数据库。

我的问题是,“ saveMddToDb”方法在“ createMddTables”方法完成之前开始。

所以我想知道如何等到第一个开始之后再开始第二个。

const db = require('./db.js');

const myDb = new db(configServer.dataBase.useDatabase === true ? configServer.dataBase.name : null);
myDb.createMddTables();
myDb.saveMddToDb(dataModel);
class Db {
  constructor(name) {
    this.db = new sqlite3.Database(name === null ? ':memory:' : name, err => {
      if (err) {
        return console.error(err.message);
      }
      console.log(colors.yellow(`Connected to the ${name === null ? 'memory' : name} SQlite database`));
    });
  }

  close() {
    this.db.close(err => {
      if (err) {
        return console.error(err.message);
      }
      console.log(colors.yellow('Close the database connection'));
    });
  };

  createMddTables() {
    this.createTableContacts();
  };

  createTableContacts() {
    const sql = `CREATE TABLE IF NOT EXISTS contacts (
      id TEXT PRIMARY KEY,
      firstName TEXT NOT NULL,
      lastName TEXT NOT NULL,
      nickName TEXT NOT NULL,
      profilePicture BLOB)`;

    this.db.run(sql, err => {
      if (err) {
        return console.log(err.message);
      }
      console.log(colors.yellow('Table contacts created'));
    });
  };

  saveMddToDb(mddJson) {
    if(mddJson) {
      const sqlContacts = `INSERT OR IGNORE INTO contacts VALUES (?, ?, ?, ?, ?)`;

      mddJson.contacts.forEach(contact => {
        this.db.run(sqlContacts, [uuidv4(), contact.firstName, contact.lastName, contact.lastName, contact.profilePicture], err => {
            if (err) {
              return console.log(err.message);
            }
            console.log(colors.yellow('Contacts added to database'));
          });
      });
    }
  }

};

module.exports = Db;

2 个答案:

答案 0 :(得分:1)

您可以使用Promises进行此操作。另外,如前所述,您可以使用async/await,它是Promises的语法糖,因此您可以像同步代码一样编写代码。

异步/等待函数总是返回一个Promise,因此在使用它之前,我建议您先查找Promises,然后尝试用它们编写代码。一旦可行,您就可以使用async / await对其进行重写,这样您就可以完全了解您正在使用什么以及它为什么起作用!

答案 1 :(得分:0)

为此,您需要使用async/await,请参见here

这是示例

async function fun1(req, res){
  let response = await request.get('http://localhost:3000');
    if (response.err) { console.log('error');}
    else { console.log('fetched response');
}