3

I have this method inside a authProvider provider class:

getUser() {
    return this.afAuth.authState.subscribe(user => {
        return user;
    });
}

I would like to subscribe to it in a different class, something like:

this.authProvider.getUser().subscribe(user => console.log(user));

any ideas how to return an Observable inside the getUser() method?

Suren Srapyan
  • 66,568
  • 14
  • 114
  • 112
Patrioticcow
  • 26,422
  • 75
  • 217
  • 337

5 Answers5

8

Your authState is already Observable. Just return your authState and subscribe within another function. In the function for any other work you can use RxJS#map function.

getUser() : Observable {
    return this.afAuth.authState.map(...);
}

....

login() {
   getUser().subscribe(user => {
       return user;
   });
}
Suren Srapyan
  • 66,568
  • 14
  • 114
  • 112
3

Don't subscribe inside the getUser function. Just return the obsevable.

getUser() {
    return this.afAuth.authState
}
Sachila Ranawaka
  • 39,756
  • 7
  • 56
  • 80
3

You can do something like this. Then in your component, the one which is calling this function, you can subscribe to this observable.

getUser(): Observable<any> {
    return Observable.create( (observer: Observer<string>) => {
     this.afAuth.authState.subscribe(user => {
        observer.next(user);
    }, (err) => observer.error("error"));
}); 
}

Ashley

mwilson
  • 12,295
  • 7
  • 55
  • 95
ashley
  • 1,008
  • 17
  • 37
  • You can also use [`Subjects`](https://stackoverflow.com/questions/34849873/what-are-the-semantics-of-different-rxjs-subjects/34860777#34860777)... – P. Moloney Sep 12 '17 at 09:43
  • 1
    create is deprecated, use new Observable() instead : `getUser(): Observable { return new Observable( (observer: Observer) => { this.afAuth.authState.subscribe(user => { observer.next(user); }, (err) => observer.error("error")); }); }` – Intuitisoft Nov 18 '19 at 18:42
1

You need to set return type as observable

getUser(): Observable<Type> {
    return this.afAuth.authState;
    });
}
Dheeraj Kumar
  • 3,917
  • 8
  • 43
  • 80
0

You can return the function directly and subscribe to it in another class.

  getUser() {
        return this.afAuth.authState();
  }

You can think of observables as functions that are called by subscribing.

this.authProvider.getUser().subscribe(user => console.log(user));
Yonet
  • 106
  • 4