1
votes

I want to check if user is authenticated in angular 2 router canActivate guard. Actually, authentication check is not asynchronous, it is just a check if this.user. But before this check (only once, when user opened website) application should get user's data from server useing http.get(). So, I want to return Observable<boolean> object that will check if this.user only when user's data received from the server.

I tried this:

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { User } from '../user';

@Injectable()
export class AuthService {
    private initPromise: Promise<boolean>;
    private user: User;

    constructor() {
        this.initPromise = new Promise(function(resolve, reject) {
            receiveUserFromServer(function(userData) {
                if (!userData) return resolve(null);

                let user = new User();
                user.id = userData.id;
                user.name = userData.name;

                resolve(user);
            });
        });
    }

    isLoggedIn() {
        // I don't know how to return Observable<boolean> here
        // true, if user from receiveUserFromServer is exists
        // but receiveUserFromServer should execute only once
    }
}
1

1 Answers

4
votes

You can use the fromPromise function.

isLoggedIn() {
    return Observable.fromPromise(this.initPromise);
}