I'm trying to determine how/if I can convert a Promise rejection into a typed Observable.
I have a login component with a function like this...
login() {
const login$ = this.authenticationService.login(this.loginForm.value)
login$
.pipe(
finalize(() => {
this.loginForm.markAsPristine();
this.isLoading = false;
}),
untilDestroyed(this)
)
.subscribe(
(credentials) => {
log.debug(`${credentials.username} successfully logged in`);
this.router.navigate([this.route.snapshot.queryParams.redirect || '/'], { replaceUrl: true });
},
(error) => {
log.debug(`Login error: ${error}`);
this.error = error;
}
)
}
and an authentication service with a method like this...
login(context: LoginContext): Observable<Credentials> {
var data = {} as Credentials
// Call a method that returns a Promise
this.server.authenticate(LoginContext)
.then((result) -> {
data.username = result.user.username
data.token = result.accessToken
this.credentialsService.setCredentials(data, context.remember)
// Not sure what to do here...need to return data somehow as an Observable
// return data
})
.catch((err) => {
// Not sure what to do here either...need to bubble the err up so that it's caught in subscribe
// return throwError(err)
})
}
How can I return an Observable<Credentials> if the Promise resolves, and bubble up the error if it rejects?
I know I can make everything work if I change the authentication service function to return Promise<Observable<Credentials>>, which is fine, but for the sake of learning new things I'm trying to figure out if this is possible.
You can use the
fromfunction to convert anyPromiseto anObservable: