【问题标题】: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 现在是异步的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-13
    • 2017-04-14
    • 2017-09-11
    • 2012-08-05
    • 2015-05-26
    • 2015-03-30
    相关资源
    最近更新 更多