angular ng 如果有异步数据?

angular ng if with async data?

在我的 angular navbar 我有一个 *ngIf 是否应该显示 login/logout 按钮

*ngIf="!authService.loggedIn()

它使用具有此登录功能的服务 returns true or false

  loggedIn() {
    return this.http.get('http://localhost:3000/users/validateToken')
      .map(res => res.json()).map(data => data.success);
  }

但是这是异步的,我如何让 ngIf 等待它?或者我怎样才能得到相同的结果?

运行 模板中的函数是一种不好的做法。您可以拥有一个与用户状态相对应的变量,并将 data.success 存储在那里。将您的异步函数调用到 ngOnInit 并将结果分配给变量。

ngOnInit() {
   return this.http.get('http://localhost:3000/users/validateToken')
      .map(res => res.json()).subscribe(data => this.isLoggedIn = data.success);
}

模板会像

*ngIf="isLoggedIn"

等待async函数的响应呢,你不用担心,如果结果会到来并赋值给变量——DI机制会检测到变化并更新模板

建议 正如我从 res.json() 猜测的那样,您使用的不是 HttpClient,而是 Http,后者已被弃用。使用 HttpClientHttpClientModule.

您可以使用 async 管道,因为如果请求 returns 一个可观察对象。

*ngIf="!authService.loggedIn() | async"

好像

*ngIf="asyncfn() | async"

只会导致无限循环,但是:

constructor() {
  this.result = this.asyncFn();
}
public asyncFn() { // ... }

模板:

*ngIf="result | async"

工作正常...可爱 Angular...您怎么会推迟它然后只在需要时才完成? Angular 团队讨厌承诺吗?