我何时可以确定该对象是否已正确初始化,例如如果在其他方法之前调用init()?

时间:2017-08-24 10:36:59

标签: angularjs

function SomeService(Restangular) {
  var promiseConf = getConf();

  function getConf() { // get from database
    return Restangular.all('conf').getList().then(function(conf) {
      return conf; 
    })
  }

  function getConfObject() {
    return promiseConf.then(confArr => {
      return _(confArr).keyBy('myConf').value();
    });
  }
}

现在,在init()方法的许多控制器中,我做了:

this.config = null;

init () {
    ...
    this.SomeService.getConfObject().then(conf => {
        this.config = do some thing with conf
    });
    ...
}

methodA () {
    // Can I be sure that in this place this.config is initialized from databse ?
}

问题是:我可以确定在init()之后调用所有方法吗? 换句话说,配置所有方法都需要初始化this.config 如果我不能假设它,如何达到这个效果?请记住我的代码。

2 个答案:

答案 0 :(得分:1)

promise的.then方法返回一个可用于链接的新promise:

this.config = null;

init () {

    this.configPromise = this.SomeService.getConfObject()
      .then(conf => {
        this.config =  conf;
        return this.config;
    });

}

通过保存返回的promise,依赖于异步数据的代码可以chain来自该承诺:

methodA () {

    // Can I be sure that in this place this.config 
    // is initialized from databse ?

    this.configPromise.then(config => {
        //Put code that depends on valid config here
    };
}

答案 1 :(得分:0)

  

//我可以确定在这个位置初始化this.config   数据库?

没有

  

如果我不能假设它,如何达到这个效果?请记住我的代码。

实现这一目标的几种方法。您可以使用'解决'或者您可以为所有州定义抽象父状态,并具有模板:

<ui-view ng-if="configLoaded"></ui-view>

然后在子状态中,您可以确定配置请求已完成。