Как получить асинхронные данные из объекта get () без возврата Promise - PullRequest
0 голосов
/ 26 февраля 2019

В NodeJS у меня есть такой объект, как

var scope = { word: "init" };

Использование Object.defineProperty, как описано в MDN Я переписываю функцию get()чтобы быть таким,

Object.defineProperty(scope, 'word', {
  get: function() {
    return Math.random();
  }
});

, который правильно возвращает новый случайный случай каждый раз, когда я scope.word в консоли.Однако функция также должна получать данные из функции с обратным вызовом.Так что это работает почти как setTimeout,

Object.defineProperty(scope, 'word', {
  get: function() {
    setTimeout(() => {
      return Math.random();
    }, 1000)
  }
});

Теперь каждый раз, когда я делаю scope.word Я получаю,

undefined

Потому чтофункция get() является синхронной.Это, конечно, можно решить, вернув Обещание,

Object.defineProperty(scope, 'word', {
  get: function() {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve(Math.random());
      }, 1000)
    });
  }
});

Но тогда мне нужно будет сделать scope.word.then(...), но вся идея, которую мы создаем, заключается в том, что разработчик должен иметь scope.word какесли бы это была простая в использовании переменная. Как в $ scope Angular или в VUE.js 'data' .

Как сделать так, чтобы функция get() возвращала фактическое значение, а не Promise?Можно ли обойти это, используя async / await?Как?

1 Ответ

0 голосов
/ 26 февраля 2019

Одним из решений является передача функции обратного вызова следующим образом.

    const scope = {}
    Object.defineProperty(scope, 'word', {
      value: (cb)=>{
      	  setTimeout(() => {
              cb(Math.random())
          }, 1000)
      }
    });

    scope.word(res=>console.log(res))
...