类构造函数中的异步数据加载

时间:2016-05-20 16:07:17

标签: javascript ecmascript-6

示例:

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函数来正常工作

1 个答案:

答案 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现在是异步的。