Search code examples
angularangular-promiserxjs6

transform to promise in callback to "from" rxjs6


Here

Inside this inner function we perform our asynchronous processing and then when we are ready we call resolve(), like so:

var promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log("Async Work Complete");
    resolve();
  }, 1000);
});

For concrete code: here firebase authentication github project,

 getCurrentUser(){
    return new Promise<any>((resolve, reject) => {
      var user = firebase.auth().onAuthStateChanged(function(user){
        if (user) {
          resolve(user);
        } else {
          reject('No user logged in');
        }
      })
    })
  }

and here stated

For rxjs 6.0.0 use:

import { from } from 'rxjs';

var observableFromPromise =  from(promiseSrc);

I could imagine solution would be

  getCurrentUser() {
    return from(firebase.auth().onAuthStateChanged(function (user) {
      user.getIdToken().then(x => {
        return x;
      })
    })
    )
  }

or

getCurrentUser() {
    firebase.auth().onAuthStateChanged(function (user) {
      return from(user.getIdToken());
    })

  }

My question is what is the equivalent second code snippet to from expression in callback?


Solution

  • I don't know if I totally understand your question but if you are trying to return an observable stream from the user token, maybe the following could work:

    getCurrentUser(): Observable<any> {
        return new Observable(observer => {
            firebase.auth().onAuthStateChanged(user => {
               user.getIdToken().then(token => {
                   observer.next(token);
               }).catch(error => {
                   observer.error(error);
               })
            })
        })
    }
    

    Any time the auth state will change, a new user token will be sent on the stream. Hope this helps.