2016-05-13 32 views
2

我有一个名为JwtService的服务。该服务具有获取用户数据的方法。我在我的组件中调用此方法:从另一个组件http.get后执行角2的方法已完成

this.JwtService.getUserData(); 

现在,无论何时单击组件中的按钮 - 我都会调用此方法。 调用此方法后,我调用另一个本地方法:

this.updateMoves(); 

其上的JwtService服务的数据工作。

问题是this.JwtService.getUserData();没有完成执行和更新新数据,而this.updateMoves();在旧数据上执行。

无用的解决方案:移动updateMoves()方法到服务并收到使它发挥作用的响应后调用它,但因为这种方法属于特定的一个组成部分,我不想这样做。

不需要的解决方案2:新的服务变量IS_LOADED并检查我的组件是否已完成加载。它在我的应用程序中导致一些问题。

任何其他解决方案在收到服务数据后可能运行updateMoves()

我getUserData()方法:

getUserData() 
    { 
     this.good = false; 
    if (this.getToken()) { 
    this.http.get('user/info?token='+this.getToken()) 
     .map((res:Response) => res.json()) 
     .subscribe(
     data => { 
      this.userData = data.user; 
      this.LOADED = true; 
     }, 
     err => { this.checkToken(err); } 
    ); 
    } 
} 
+0

你应该添加组件类和装饰到后的代码,硬顶猜发生了什么有 – shershen

+0

你可以从你的'getUserData()'方法返回一个可观的,所以你可以后执行一切成功了。 – rinukkusu

回答

3

如果您getUserData方法返回一个可观察的,你可以订阅它,并在相关联的回调执行第二种方法:

this.JwtService.getUserData().subscribe(() => { 
    this.updateMoves(); 
}); 

编辑

您可以使用docatch运算符:

getUserData() { 
    this.good = false; 
    if (this.getToken()) { 
    return this.http.get('user/info?token='+this.getToken()) 
     .map((res:Response) => res.json()) 
     .do(
     data => { 
      this.userData = data.user; 
      this.LOADED = true; 
     }) 
     .catch(
     err => { this.checkToken(err); } 
    ); 
    } else { 
    return Observable.throw('Not good'); 
    } 
} 
+0

我有变量命名'用户数据'等于响应对象,这是所有使用我的应用程序,如果更改方法返回一个observable不会允许我更新'userData'变量,并强迫我再次获取每个组件,这似乎是一个坏主意。请看看我目前的'getuserdata'方法 – TheUnreal

+0

感谢您分享您的方法。您可以改用'do'和'catch'运算符。我解开了我的答案... –

+0

真棒谢谢你!只是为了确保,如果我想在运行getUserData()时不执行任何代码,那么我应该将括号{}留空,或者有更干净的方法来做到这一点? – TheUnreal

相关问题