为什么我不能在ngOnInit()方法之外使用这个对象?

时间:2017-09-02 20:57:01

标签: javascript json angular typescript mean-stack

我从我的服务器获取一些数据,并希望在.ts文件中使用它做一些事情。到目前为止,我还不了解关于打字稿/角度的基本事情......希望有人可以帮助我

user: any;

public doStuff(){
    alert(this.user.username);
 }

用户是具有不同属性的对象,例如在ngOnInit()块上初始化的'username'。 我在ngOnInit方法中设置它。正确注入服务并且代码正常工作

ngOnInit() {

this.authService.getProfile().subscribe(profile =>{
    this.user= profile.user;
    this.initStuff();

  },
  err => {
    console.log(err);
    return false;
  });
 }

它按预期警告用户名...但是一旦我将doStuff()方法的方法调用移到Codeblock之外,它就不再工作了,在浏览器控制台中它说“无法读取属性”值'未定义' - 为什么它未定义?如果我在component.html中使用{{user.username}},它还会显示正确的用户名

ngOnInit() {

this.authService.getProfile().subscribe(profile =>{
    this.user= profile.user;
  },
  err => {
    console.log(err);
    return false;
  });
    this.initStuff(); // why cant i call it here? Its where I also call all of my other doStuff() methods
 }

2 个答案:

答案 0 :(得分:0)

它不起作用,因为getProfile()是异步操作。如果你想做服务器数据的东西,它必须在subscribe next()方法中完成。当aysnc操作具有新值时,将调用next方法。

如果你在next()方法之外调用initStuff(),那么它将立即被执行,这就是为什么你得到"无法读取peoperty' value'未定义"。

希望这可以帮到你。

答案 1 :(得分:0)

如果我已正确理解你正在尝试调用尚未收到的数据,那么你就是控制台错误的原因。在描述的函数中,您使用Observable(RxJs)并且函数是异步的。如果你想用变量' profile'做一些事情。你应该把操作放在Observable回调中,这意味着在body subscribe的调用方法中。