[FIXED] Rxjs toPromise() deprecated


I have read that toPromise() is being deprecated in RxJS 7 and will be removed in RxJS 8.
I have often used it with async await syntax in angular to handle http calls. Is it considered an anti pattern?
I understand the concept of streams but an http call only emit a single value. I don’t get the point of observable for a simple http call. What should I use next? should I fully embrace reactive programming?


Why is this happening?

As mentioned here, these are the main reasons why toPromise is being deprecated:

  1. One goal was to remove it from the Observable prototype and turn it into a standalone util function.

  2. The naming of toPromise is not the best. Especially when used in combination with await it does not read very well: await categories$.toPromise() vs await lastValueFrom(categories$)

  3. The type information of toPromise is wrong. When the source Observable completed without ever emitting a single value – it
    resolved with undefined. It should reject in that case. A Promise is a
    "promise" that when it resolves a value will be there – and be it
    undefined. But when the stream completes without ever emitting a value
    you can’t differentiate between a stream that a emitted undefined on
    purpose and a stream that completed without ever emitting anymore

What should you use next?

If you really insist doing it the promise way, lastValueFrom/firstValueFrom. Otherwise switching to reactive programming would be the way to go.

Using toPromise ( deprecated ) –

public async loadCategories() {
    this.categories = await this.inventoryService

Using lastValueFrom ( new ) –

import { lastValueFrom } from 'rxjs';

public async loadCategories() {
    const categories$ = this.inventoryService.getCategories();
    this.categories = await lastValueFrom(categories$);

This link should help –


Answered By – Pawan Sharma

Answer Checked By – Pedro (Easybugfix Volunteer)

Leave a Reply

(*) Required, Your email will not be published