Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.03.2019, 13:03
Аватар для villiwalla
Интересующийся
Отправить личное сообщение для villiwalla Посмотреть профиль Найти все сообщения от villiwalla
 
Регистрация: 16.02.2016
Сообщений: 29

Работа с sqlite
Более подходящей ветки форму подобрать получилось, извиняй если что
Делаю приложение на eletron. Для работы с БД выбрал sqlite. При старте приложения хочу получить список сотрудников(worker). Но получается, что мне в ответ возвращается 2 объекта. Сначала Primise и и только потом уже Object (с записью из бд).

Как мне при вызов User.getWorker() и в подобных получать сразу объект из бд а не промис и только потом уже запись бд.

Сейчас всё выглядит следующим образом:

Database.js
'use strict';

class Database {

    constructor() {
        this._sqlite3 = require('sqlite3').verbose();
        this._conn = new this._sqlite3.Database(__dirname + '/database.sqlite');
    }


    findOne(sql, params) {
       return new Promise((resolve, reject) => this._conn.get(sql, params, function (err, row) {
           if(err) reject(err);
           resolve(row)
       }));
    }
}


User.js
'use strict';

class User extends Database {
    constructor() {
        super();
    }

   getWorker() {
    let sql = 'select u.*, w.password from users u, workers w where u.id = w.user_id and u.type_id = ?';
    return super.findOne(sql, [1]);
   }

}


index.js
let user = new User();
console.log(user.getWorker().then(res => { console.log(res )}));


В ответ при старте приложения получаю:


Хотел всегда наследоваться от Database и не писать на вызовах ребёнка .then().cath(). Пробывал так в классе Database:
_query(sql, params, action) {
        return new Promise((resolve, reject) => {
            this._conn[action](sql, params, function (err, data) {
                if(err) reject(err);
                resolve(data)
            })
        });
    }

    findOne(sql, params) {
       return this._query(sql, params, 'get').then((res) => res);
   }


В ответ приходит промис с содержанием ответа в [[PromiseValue]]. Но не сам объект записи из БД.


Объясните что я не так делаю, что бы я мог просто использовать super.findOne(sql, params) и в ответ уже получать нормальный объект записи из бд а не промис?

Последний раз редактировалось villiwalla, 12.03.2019 в 13:25.
Ответить с цитированием
  #2 (permalink)  
Старый 12.03.2019, 14:57
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 641

async/await в помощь

<script>

  class FakeDB {

    constructor() { }

    getData(data) {
      return new Promise((res, rej) => setTimeout(res, 100, data))
    }
  }

  class User extends FakeDB {

    constructor() {
      super()
    }

    getUser() {
      return super.getData({ user: 'ok' })
    }
  }

  (async function () {
    let user = new User()
    console.log(await user.getUser())
  })()

</script>
Ответить с цитированием
  #3 (permalink)  
Старый 12.03.2019, 15:54
Аватар для villiwalla
Интересующийся
Отправить личное сообщение для villiwalla Посмотреть профиль Найти все сообщения от villiwalla
 
Регистрация: 16.02.2016
Сообщений: 29

Сообщение от SuperZen Посмотреть сообщение
async/await в помощь

<script>

  class FakeDB {

    constructor() { }

    getData(data) {
      return new Promise((res, rej) => setTimeout(res, 100, data))
    }
  }

  class User extends FakeDB {

    constructor() {
      super()
    }

    getUser() {
      return super.getData({ user: 'ok' })
    }
  }

  (async function () {
    let user = new User()
    console.log(await user.getUser())
  })()

</script>
Без вариантов получается, везде где дёргаю метод класса (модели) придётся такую конструкцию делать?

(async function () {
    let user = new User()
    console.log(await user.getUser())
  })()
Ответить с цитированием
  #4 (permalink)  
Старый 12.03.2019, 16:19
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 641

Сделай управляющий класс в нем методы async/await...
<script>
  class Logic {
    constructor() {

    }
    run(blabla) {
      setInterval(this.doLogic, 100, blabla)
    }
    async doLogic(data) {
      const res = await Promise.resolve(data)
      console.log(res)
      return res
    }
  }

  const logic = new Logic()
  logic.run({ do: 'it' })
</script>


или изучай javascript больше...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вакансия: Программист IOS, работа в офисе,г.Ростов-на-Дону Анна NikitaOnline Работа 0 21.03.2016 18:45
NodeJS, как работать с SQLite? Riim AJAX и COMET 22 11.10.2011 17:56
Постоянная работа / Front-end / Москва kooper Работа 4 29.09.2011 22:06