Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Асинхронный запрос в PostgreSQL из NodeJS, Проблема с асинхронностью 
:(
    Опции темы
Elfix
Дата 25.2.2018, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 13.7.2005

Репутация: нет
Всего: нет



Приветствую,

пытаюсь создать простой класс, который из базы данных вытягивает нужные данные.
Вот такой класс получился для примера:

Код

const { Pool } = require('pg');

const pg = new Pool({
    connectionString: connectionString
});

class Contragent {
    constructor (id) {
        this.init(id);
    }
    
    init(id) {
        pg.query('SELECT * FROM contragents WHERE id = ' + id, (err, res) => {
            this.id = res.rows[0].id;
            this.contragentName = res.rows[0].contragent_name;
            return;
        });
    }
    
    getId () {
        return this.id;
    }
    
    getContragentName() {
        return this.contragentName;
    }
}


Из-за того, что JavaScript работает асинхронно, приходится ждать, когда отработает конструктор класса, после чего можно уже пользоваться свойствами класса.
Т. е. вот такой код написать не получается:

Код

const contragent = new Contragent(1);
console.log(contragent.getContragentName());


Всегда возвращает undefinded.

А вот такой код вполне работает:
Код

setTimeout(function () {
    console.log(contragent.getContragentName());
}, 5000);


Можно ли как-то побороть эту асинхронность? Можно ли сделать так, чтобы управление к console.log(contragent.getContragentName()); не переходило, пока класс полностью не проиницилизируется?
Буду рад получить любую помощь по данному вопросу. Я слышал это как-то можно сделать через async / await, но не понимаю как это работает :(
PM MAIL   Вверх
EgoBrain
Дата 2.9.2020, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: нет
Всего: 2



Цитата

Можно ли как-то побороть эту асинхронность? Можно ли сделать так, чтобы управление к console.log(contragent.getContragentName()); не переходило, пока класс полностью не проиницилизируется?
Буду рад получить любую помощь по данному вопросу. Я слышал это как-то можно сделать через async / await, но не понимаю как это работает :( 

Код

constructor (id) {
       let result = await this.init(id);
       this.id = result.rows[0].id;
}

async init(id) {
    let promise = new Promise((resolve, reject) => {
        pg.query('SELECT * FROM contragents WHERE id = ' + id, (err, res) => resolve(res));
   });

    result = await promise;    

    return result;
}


Это сообщение отредактировал(а) EgoBrain - 2.9.2020, 07:55
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Node.js | Следующая тема »


 




[ Время генерации скрипта: 0.1009 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.