等待LoginService中加载的userdata

时间:2017-03-14 00:38:09

标签: javascript angular firebase firebase-realtime-database angularfire2

我想在我的LoginService中加载我的用户数据节点,并在加载其他服务之前等待,因为所有其他服务的路径的一部分取决于userdata。 (在我的情况下,我想在userdata节点中保存一个gameid - >例如我的用户已经签署了gameid:1 其他数据的路径是/ 1 / chat,...)

Auth.guard.ts

//Angular
import { Observable } from 'rxjs/Rx';
import { Injectable } from '@angular/core';
import { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
//Services
import { LoginService } from '../services/login.service';

@Injectable()
export class AuthGuard implements CanActivate{

  constructor(
    private router: Router,
    private loginService: LoginService,
  ){}

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
    return this.loginService.getAuthenticated().map(user => {
          this.loginService.setUser(user);
          if(user) {
            return true;
          } else {
            this.router.navigate(['/login']);
            return false;
          }
    })
  }

}

Login.service.ts

//Angular
import { Injectable, Inject }     from '@angular/core';
import { Router } from '@angular/router';
import { Http, Response, Headers, RequestOptions } from '@angular/http';
//Rxjs
import { Observable } from 'rxjs';
//Firebase
import { AngularFire, AuthProviders, FirebaseAuthState, FirebaseListObservable, FirebaseObjectObservable, AuthMethods, FirebaseApp } from 'angularfire2';
//Models
import { LoginModel } from '../models/login';

@Injectable()
export class LoginService {

    public user: any;
    public firebase: any;
    public gameid: String;

    constructor (
        private router: Router,
        public af: AngularFire,
        @Inject(FirebaseApp) firebase: any
    ){
        this.firebase = firebase;
    }

    setUser(user): void { 
        this.user = user;
        //update last activity
        if(this.user != undefined && this.user != null){
          this.af.database.object(`users/${this.user.uid}`).subscribe(user => { this.gameid = user.gameid }
        }
    }

Chat.service.ts&lt; - 此处崩溃,因为Login.service.ts中的observable未完成

//Angular
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { Http, Response, Headers, RequestOptions } from '@angular/http';
import { Observable } from 'rxjs';
//Firebase
import { FirebaseListObservable, FirebaseObjectObservable } from 'angularfire2';
//Services
import { LoginService } from '../services/login.service';
import { MembersService } from '../services/members.service';
//Models
import { ChatModel } from '../models/chat';

@Injectable()
export class ChatService {

  constructor (
      private loginService: LoginService,
      private membersService: MembersService,
      private router: Router
  ){}

    getLast(): Observable<any> {
        return this.loginService.af.database.list(this.loginService.gameid+`/chat/`)
    }

}

任何人都可以告诉我如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

常见的方法是在protected void OnDeletingGw_Pack(Gw_Pack pack) { var trades = ModelContext.Gw_PackJunction.Where(e => e.PackID == pack.PackID).ToList(); if (pack.Groupage == true || trades.Count > 1) { // Don't delete a pack if it is a groupage container or if it's associated with more than one Trade. throw new Exception("The container you are trying to delete is either marked as groupage or is functioning as a groupage container in another file."); } } 中提供Observable,其中所有其他服务都可以订阅,LoginService用于通知其他感兴趣的服务和组件有关状态更改。

LoginService
@Injectable()
export class LoginService {
  private loginData:Subject = new BehaviorSubject();
  public loginData$ = this.loginData.asObservable();

  setUser(user): void { 
    this.user = user;
    //update last activity
    if(this.user != undefined && this.user != null){
      this.af.database.object(`users/${this.user.uid}`).subscribe(user => { this.gameid = user.gameid;
 this.loginData.next(...); }
    }
}