Нужно установить getter для поля. Getter должен делать запрос к базе данных. У мне нужно, чтобы getter возвращал не promise, а значение
console.log((new User(...)).proxy)
async function fetchProxy() {
return new Promise(function (resolve, reject) {
database.query("SELECT `url` FROM `proxys` WHERE `in_use` = 0 LIMIT 1", function (err, result) {
resolve(JSON.parse(JSON.stringify(result)).url);
})
});
}
В классе:
Object.defineProperties(this, {
proxy: {
_proxy: null,
get: function () {
if (!this._proxy) {
this._proxy await fetchProxy();
}
return this._proxy;
}
}
});
async возвращает промис, Вы пытаетесь получить результат через
(new User(...)).proxy
но это промис в состоянии pending, чтобы получить значение Вам надо:
new User(...).proxy.then(result => console.log(result))
вот рабочий пример:
const obj = {}
// как объявлять
Object.defineProperties(obj, {
property: {
async get () { // пример асинхронного гетера
const result = await promise()
return result
}
}
});
// как получить
obj.property.then(val => alert(val))
// промис для примера
function promise () {
return new Promise(resolve => {
setTimeout(resolve, 1200, 'Результат')
})
}
UPDATE: ThisMan:
зачем писать await? если в result промис, а не значение
Если у вас в геттере один промис, то его можно просто вернуть, чтобы он выполнился в obj.property.then:
const obj = {}
// как объявлять
Object.defineProperties(obj, {
property: {
get: () => promise()
}
});
// как получить
obj.property.then(val => alert(val))
// промис для примера
function promise () {
return new Promise(resolve => {
setTimeout(resolve, 1200, 'Результат')
})
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей