Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.02.2018, 09:42
Аспирант
Отправить личное сообщение для Elfix Посмотреть профиль Найти все сообщения от Elfix
 
Регистрация: 03.01.2018
Сообщений: 38

Видимость this в Class
Приветствую,

const postgresql = require('pg-promise-simple');
const connectionString = "строка подключения к базе данных";

class Database {
	constructor() {
		postgresql.connect(connectionString).then(connection => {
			this.database = connection.client;
		}).catch(error => {
			this.database = 0;
		});
	}
	
	getDatabase() {
		return this.database;
                // Всегда возвращает undefined
               // Хотя должен вернуть либо json либо 0
	}
}

module.exports.Database = Database;


this.database инициализируется в конструкторе.
А когда вызывается метод класса getDatabase this.database уже underfined.

Работа с классом происходит вот так:
const database = require('.../database.js');

data = new database.Database();
console.log(data.getDatabase());


После отработки программа не завершается, а продолжает висеть в памяти.

1. Что делаю не так, почему this.database равен underfined в методах класса, несмотря на инициализацию его в конструкторе;
2. Почему программа не завершается, а продолжает висеть в памяти. Как ее завершить принудительно?
Ответить с цитированием
  #2 (permalink)  
Старый 24.02.2018, 10:04
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Elfix
После отработки программа не завершается, а продолжает висеть в памяти.
потому, что disconnect нужно делать.

Могу дать пример для pg:
const {Client} = require('pg')
const {development: env} = require('../../../env.json')

const database = new Client({
  connectionString: env.DATABASE_CONNECTION_URI
})

database.connect() // ON -> promise
// ...
database.end() // OFF -> promise
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #3 (permalink)  
Старый 24.02.2018, 13:10
Аспирант
Отправить личное сообщение для Elfix Посмотреть профиль Найти все сообщения от Elfix
 
Регистрация: 03.01.2018
Сообщений: 38

Ок. Спасибо за ответ.
А как на счет этого:

getDatabase() {
        return this.database;
        // Всегда возвращает undefined
        // Хотя должен вернуть либо json либо 0
    }
Почему JavaScript записывает в переменную this.database, но потом внутри метода этого же класса не может ее прочитать?
Ответить с цитированием
  #4 (permalink)  
Старый 24.02.2018, 13:18
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,584

Elfix, потому что асинхронность:
data = new database.Database();  //1. пошёл коннект к базе
console.log(data.getDatabase()); //2. запрос несуществующей переменной
//3. ...
//4. соединение установилось, переменная задана
__________________
29375, 35

Последний раз редактировалось Aetae, 24.02.2018 в 13:23.
Ответить с цитированием
  #5 (permalink)  
Старый 24.02.2018, 13:31
Аспирант
Отправить личное сообщение для Elfix Посмотреть профиль Найти все сообщения от Elfix
 
Регистрация: 03.01.2018
Сообщений: 38

Благодарю. Как это победить?
Ответить с цитированием
  #6 (permalink)  
Старый 24.02.2018, 13:57
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,584

Не делать в конструкотре асинхронных вещей.)
__________________
29375, 35
Ответить с цитированием
  #7 (permalink)  
Старый 24.02.2018, 14:18
Аспирант
Отправить личное сообщение для Elfix Посмотреть профиль Найти все сообщения от Elfix
 
Регистрация: 03.01.2018
Сообщений: 38

Ха, прекрасный совет: чтобы не было проблемы - не создавай ее?
А если серьезно. Мне нужно чтобы коннкшн к базе был где-то сохранен и использовался несколько раз.

А вот сами запросы было бы неплохо, чтобы запускались асинхронно.
Как это сделать? Т. е. мне нужно чтобы программа при connect как-то зависла, пока этот connect не отработает, а потом уже пользоваться всеми прелестями асинхронности.
Ответить с цитированием
  #8 (permalink)  
Старый 24.02.2018, 16:53
Профессор
Отправить личное сообщение для Audaxviator Посмотреть профиль Найти все сообщения от Audaxviator
 
Регистрация: 28.04.2017
Сообщений: 214

Думаю, это всё, что нужно для этого модуля подключения/отключения:
const postgresql = require('pg-promise-simple');
const connectionString = "строка подключения к базе данных";

postgresql.connect(connectionString);

function disconnectDB() {
  postgresql.end();
}
	 
module.exports = postgresql;
exports.disconnectDB = disconnectDB;

А then и catch делать уже "на месте".

Последний раз редактировалось Audaxviator, 24.02.2018 в 17:07.
Ответить с цитированием
  #9 (permalink)  
Старый 24.02.2018, 17:17
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,584

Elfix, nerv_ показал как. При создании класса никакого коннекта. Отдельный метод connect, возвращающий промис. database.connect().then().then()....then();
__________________
29375, 35
Ответить с цитированием
  #10 (permalink)  
Старый 24.02.2018, 18:25
Аспирант
Отправить личное сообщение для Elfix Посмотреть профиль Найти все сообщения от Elfix
 
Регистрация: 03.01.2018
Сообщений: 38

Ок. Бог с ним с классом.

Попробую по-другому объяснить.
Вот такой код работает:
const postgresql = require('pg-promise-simple');
const connectionString = "строка подключения";
var client;

postgresql.connect(connectionString).then(connection => {
	client = connection.client;
	client.query('Мой запрос на SQL').then(result => {
		console.log(result);
	client.end();
	});
});
Все отлично работает. Но есть недостаток - я подключился к базе, выполнил запрос и отключился от нее. Нет возможности пользоваться подключением в переменной connect. Я воспользовался соединением и закрыл его.

Вот такой код не работает:
const postgresql = require('pg-promise-simple');
const connectionString = "строка подключения";
var client;

postgresql.connect(connectionString).then(connection => {
	client = connection.client;
});

// В этом месте нужно как-то зависнуть, пока переменной client не будет присвоено значение

client.query('Мой запрос на SQL').then(result => {
	console.log(result);
});
Второй код уже не работает. Вот мне нужно как-то так сделать, чтобы у меня был коннект к базе и я им всегда мог пользоваться. пример nerv_ не подходит, так как просто вызвав connect у меня отсутствует информация о подключении, и мне нужно then вызывать и этот же then как-то останавливать пока нужный connection.client не будет получен...
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выполнение <script> При определенном class ilya1099 Javascript под браузер 0 06.11.2016 23:12
Присвоить разные class элементу li, какаие есть способы? aleksandr8i Javascript под браузер 11 12.03.2015 23:46
Знаменитая функция Class учавствует в фреймворке ui2/0 __он_самый__ Оффтопик 3 29.12.2014 13:19
Использование классов в JavaScript devote Ваши сайты и скрипты 70 01.02.2013 17:17
Как работает функция Class godofjavascript Оффтопик 58 17.12.2012 09:49