在类实例化

时间:2018-05-13 23:24:38

标签: javascript promise

我希望我的类中的一个属性的值是异步值。它几乎可以工作;当您致电setTimeout时,profile.songs实际上已通过Promise {<resolved>: Array(100)}解决。

除此之外,我希望Array(100)(在本例中为Promise)为property.songs的值。

编辑:我应该为问题添加一些清晰度。必须同步实例化对象,即profile.toxicGarbageIslandprofile.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)

N.B。我已从constructor中移除了承诺,以确保其唯一的关注点是返回一个对象实例,我已经阅读过最佳实践。

1 个答案:

答案 0 :(得分:1)

不要将承诺分配给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)