示例:
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
函数,它将返回promise,但是,每次我使用我的类时,我都会依赖init函数来正常工作
答案 0 :(得分:6)
当我调用
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。将承诺存储在对象上:
class Test {
constructor(){
this.importantData = readBackend();
}
someFunc() {
this.importantData.then(data => {
// iterate over important data
});
}
}
当然如果someFunc
应该返回某些东西,那么它也需要它返回一个承诺。即你的类的API现在是异步的。