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

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

最佳答案

Is there any way to ensure, that object properties are initiated by constructor, when I call 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 应该返回一些东西,那也需要它返回一个 promise 。 IE。您的类的 API 现在是异步的。

关于javascript - 类构造函数中的异步数据加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37351146/

相关文章:

javascript - 将多个操作绑定(bind)到事件监听器时的性能问题

ecmascript-6 - ES6 意外 token

javascript - 根据mysql表中的值更改行的字体颜色

javascript - 在 JavaScript 中将字节数组转换为有符号 int64

javascript - 如何使用对象字段的动态值?

reactjs - React警告: Each child in an array or iterator should have a unique "key" prop.检查 `App`的渲染方法

javascript - 如何使用 "in"和/或 "hasOwnProperty"缩小对象类型

Javascript - 谷歌闭包注释属性类型

javascript - 如何在 popup.html 中以编程方式隐藏扩展程序的浏览器操作图标?

javascript - Hoare Quicksort 算法无法正常工作