How to convert Observable to Promise in angular|Typescript

Sometimes, We want to convert the observable to a promise object and call callback then() on the promise in Angular. Observable returns multiple values and promise returns single values. You can check other posts on How to always run some code when a promise is resolved or rejected

Observable is more feature-rich than promises and recommended. However, some cases need to convert to promises.

  • You have to pass data to a third-party API that accepts only promises

How to Convert Observable to Promise in Angular

There are multiple ways we can do

  • use the toPromise method

Observable has the toPromise() method that subscribes to observable and returns the promise.

Note: Please make sure that the observable should complete the operation, Otherwise, It struck forever and causes memory errors.

Here is a syntax

Observable.toPromise().then();

Here is a complete example to convert to promise in Angular.

import { Component } from '@angular/core';
import { delay, Observable, of } from 'rxjs';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent {
  private myarray: string[] = ["test", "test2", "test3"]
  strings$: Observable<string[]> = of(this.myarray);
  array1$: Observable<string[]> = of(this.myarray).pipe(delay(5000));

  constructor() {
    console.log("start")

    const example = this.array1$.toPromise()
      .then(item => {
        console.log('Returned Promise value:', item);
      });

    console.log("end")
  }

}

Output:

start
end
Returned Promise value: (3)['test', 'test2', 'test3']

toPromise() is deprecated in rxjs7 version.

Rxjs provides lastValueFrom and firstValueFrom methods to convert promises.

lastValueFrom() used in place of toPromise() that return the stream of data

  public async getPromiseUseLast() {
    const promiseVar = await lastValueFrom(this.array1$);
    console.log('Returned lastValueFrom usage value:', promiseVar);

    return promiseVar;
  }

firstValueFrom() does not consider a stream of data, takes the first data, and unsubscribes from the stream.

public async getPromiseUseFirst() {
  const promiseVar = await firstValueFrom(this.array1$);
  console.log('Returned firstValueFrom usage value:', promiseVar);

  return promiseVar;
}

Conclusion

In a summary,

Observable is more advanced and feature-rich than a promise, Some times need to convert the promise into Angular.