Установка асинхронного значения в качестве значения свойства после создания класса - PullRequest
0 голосов
/ 14 мая 2018

Я бы хотел, чтобы значение одного из свойств в моем классе было асинхронным.Это почти работает;когда вы звоните setTimeout, profile.songs фактически разрешается с Promise {<resolved>: Array(100)}.

Кроме того, я хочу, чтобы значение (в данном случае Array(100)) Promise было значением property.songs.

Редактировать: Iследует добавить некоторую ясность в вопрос.Объект должен создаваться синхронно, то есть profile.toxicGarbageIsland и profile.spiceUpYourLife являются обязательными и необходимы для создания объекта.Однако значение обещания profile.songs является необязательным и может прийти после создания экземпляра объекта.

class Gojira {
  constructor (profile) {
    Object.assign(this, profile)
  }

  static init () {
    let profile = {};

    profile.toxicGarbageIsland = true;
    profile.spiceUpYourLife = false;
    profile.songs = axios.get('https://jsonplaceholder.typicode.com/posts')
      .then(function(response){
        return response.data;   
      }).catch(function (error) {
        console.log(error)
      })

    return new Gojira(profile);
  }
}


let gojiraInstance = Gojira.init();

setTimeout(function(){
  console.log(gojiraInstance)
}, 2000)

NB. Я удалил обещание из constructor, чтобы убедиться, что его заботой является только возврат экземпляра объекта, который, как я прочитал, является лучшей практикой.

1 Ответ

0 голосов
/ 14 мая 2018

Не присваивайте обещание profile.songs - вместо этого просто запустите обещание, а при разрешении присвойте результат profile.songs и вызовите конструктор.

static init() {
  let profile = {};

  profile.toxicGarbageIsland = true;
  profile.spiceUpYourLife = false;
  return axios.get('https://jsonplaceholder.typicode.com/posts')
    .then(function(response) {
      profile.songs = response.data;
      return new Gojira(profile);
    }).catch(function(error) {
      console.log(error)
    });
}

Вам также придется использовать его асинхронно:

Gojira.init()
  .then(gojiraInstance => {
    // ...
  });

Я предполагаю, что конструктор требует, чтобы profile был полностью установлен перед запуском. Если нет, то позвольте конструктору также принять Promise в качестве параметра, который затем назначает свойство songs для разрешения, например:

class Gojira {
  constructor (profile, songsPromise) {
    Object.assign(this, profile);
    if (songsPromise) songsPromise.then(({ data }) => this.songs = data);
  }
  static init () {
    const profile = {};
    profile.toxicGarbageIsland = true;
    profile.spiceUpYourLife = false;
    const songsPromise = axios.get('https://jsonplaceholder.typicode.com/posts')
      .catch(error => console.log(error));
    return new Gojira(profile, songsPromise);
  }
}
const gojiraInstance = Gojira.init();
setTimeout(function(){
  console.log(gojiraInstance)
}, 2000)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...