NodeJS синхронный get

171
07 января 2019, 04:20

Нужно установить 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;
        }
    }
});
Answer 1

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, 'Результат') 
  }) 
}

READ ALSO
WebSocket в Javascript

WebSocket в Javascript

На сервере(tcp) стоит python скрипт, на модуле socket, не могу подключиться, открываю Console в гугл хром и получается такй вывод:

147
Не отсылать запросы

Не отсылать запросы

Задача в следующем: На странице есть несколько блоковПри наведении мыши на блок отправляется запрос на сервер и ответ вставляется в этот...

169
Как лучше загружать файлы на сервер?

Как лучше загружать файлы на сервер?

Занимаюсь разработкой веб-приложений уже около годаЗагрузку файлов на сервер, например, при регистрации в системе, делал таким образом, что...

178
Максимальное значение строки mysql

Максимальное значение строки mysql

Какое максимальное значение может быть в строке mysql? Например (name VARCHAR (??????????)

178