在Angular2中执行函数之前获取Observable值

时间:2016-10-28 12:14:26

标签: angular firebase observable

我有一个简单的简单系统,带有Firebase的用户身份验证系统。我想收到当前登录用户的数据列表。我通过订阅Firebase中的observable从当前登录用户那里获取信息。

但是,在调用private authId函数之前,不会调用在我的构造函数中设置的getAllEmails()的值。因此${this.authId}产生未定义。在调用getAllEmails函数之前,如何确保从observable中获取authId的值?

import { Injectable } from '@angular/core';
import { AngularFire, FirebaseListObservable } from 'angularfire2';
import { Email } from '../email';
import { AuthService } from '../auth/auth.service';

@Injectable()
export class EmailService {

  private authId: string;

  constructor(
    private af: AngularFire,
    private authService: AuthService
  ) {
    this.authService.getUserInformation()
      .subscribe(user => {
        this.authId = user.authId;
      })
  }    

  getAllEmails(): FirebaseListObservable<any> {
    return this.af.database.list(`/emails/${this.authId}`);
  }

}

1 个答案:

答案 0 :(得分:1)

您可以为此做几件事

  1. 创建基本服务类并在基类
  2. 的构造函数中获取authId
  3. 在Component的构造函数中获取authId并调用getAllEmails(authId)
  4. 解决方案如下:

    export class baseService{
    
    private authId: string;
    
      constructor(private authService: AuthService) {
        this.authService.getUserInformation()
          .subscribe(user => {
            this.authId = user.authId;
          })
      }
    getAuthId(): number{
           return this.authId;
    }
    }
    
    import {baseService} from '<yourPath>'
    
    @Injectable()
    export class EmailService extends baseService {
    
      private authId: string;
    
      constructor(private af: AngularFire) {  }    
    
      getAllEmails(): FirebaseListObservable<any> {
        return this.af.database.list('/emails/'+ super.getAuthId());
      }
    
    }
    

    第二个解决方案是:

    而不是基类有另一个服务类来获取控制器中的AuthId并传递它。我认为第一个解决方案要好一点。