【问题标题】:Asynchronous data loading in class constructor [duplicate]类构造函数中的异步数据加载[重复]
【发布时间】:2016-05-20 16:07:16
【问题描述】:
例子:
var readBackend = function(){
var deferred = q.defer();
readData().then(function(data) {
deferred.resolve(data);
})
return deferred.promise;
}
class Test {
constructor(){
readBackend().then(function(data) {
this.importantData = data;
})
}
someFunc() {
//iterate over important data, but important data is defined
//promise didnt resolved yet
}
}
var test = new Test();
test.someFunc(); //throws exception!
当我调用someFunc 时,有什么方法可以确保对象属性由构造函数初始化?
我想到的唯一方法是创建init 函数,它将返回承诺,但是每次我使用我的类时,我都会依赖 init 函数来正常工作
【问题讨论】:
标签:
javascript
ecmascript-6
【解决方案1】:
当我调用someFunc 时,有什么方法可以确保对象属性由构造函数初始化?
如果不重新构建您的代码,则并非如此。您不能让您的构造函数执行异步操作并期望您的同步方法工作。
我看到了两种可能的解决方案:
1。有一个静态方法来加载数据并返回你的类的一个新实例:
class Test {
static createFromBackend() {
return readBackend().then(data => new Test(data));
}
constructor(data){
this.importantData = data;
}
someFunc() {
// iterate over important data
}
}
Test.createFromBackend().then(test => {
test.someFunc();
});
这样可以确保在创建实例时数据可用,并且您可以保持类的 API 同步。
2。将 promise 存储在对象上:
class Test {
constructor(){
this.importantData = readBackend();
}
someFunc() {
this.importantData.then(data => {
// iterate over important data
});
}
}
当然,如果someFunc 应该返回一些东西,那也需要它返回一个承诺。 IE。您的类的 API 现在是异步的。