我希望我的类中的一个属性的值是异步值。它几乎可以工作;当您致电setTimeout
时,profile.songs
实际上已通过Promise {<resolved>: Array(100)}
解决。
除此之外,我希望Array(100)
的值(在本例中为Promise
)为property.songs
的值。
编辑:我应该为问题添加一些清晰度。必须同步实例化对象,即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)
N.B。我已从constructor
中移除了承诺,以确保其唯一的关注点是返回一个对象实例,我已经阅读过最佳实践。
答案 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)