Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 686
Matias Avatar asked Apr 11 '21 11:04

Matias


People also ask

Is toPromise deprecated?

but toPromise() is deprecated in recent versions of angular / rxjs.

What is the difference between an Observable and a promise?

Promises deal with one asynchronous event at a time, while observables handle a sequence of asynchronous events over a period of time.

How do you make an Observable promise?

How to Convert an Observable to a Promise in Angular? Since the get method of HttpClient returns an observable, we use the toPromise() method to convert the observable to a promise. Since you can convert an observable to a promise, you can make use of the async/await syntax in your Angular code.

What is toPromise () in angular?

The toPromise function lives on the prototype of Observable and is a util method that is used to convert an Observable into a Promise . Inside this function we subscribe to the Observable and resolve the Promise with the last emitted value - attention - when the Observable completes!

What happened to topromise in RxJS?

RxJS heads up: toPromise is being deprecated. In RxJS 7 toPromise will become deprecated and with RxJS 8 it will be gone! So avoid using toPromise in your future development when possible.

Is topromise deprecated in angular / RxJS?

but toPromise () is deprecated in recent versions of angular / rxjs. /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}.

How do I replace the deprecated topromise () method in Salesforce?

As a replacement to the deprecated toPromise () method, you should use one of the two built in static conversion functions firstValueFrom or lastValueFrom.

What is the return type of lastvaluefrom in RxJS?

Thus, the return type of the lastValueFrom is Promise<T>, just like toPromise () had in RxJS 6. However, you might want to take the first value as it arrives without waiting an Observable to complete, thus you can use firstValueFrom.


Video Answer


3 Answers

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
      .getCategories()
      .toPromise()
}

Using lastValueFrom ( new ) -

import { lastValueFrom } from 'rxjs';

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

This link should help -

https://indepth.dev/posts/1287/rxjs-heads-up-topromise-is-being-deprecated

like image 167
Pawan Sharma Avatar answered Oct 16 '22 08:10

Pawan Sharma


firstValueFrom and lastValueFrom is definitly a better alternative for many reasons:

  1. The naming is more readable and self explanatory.
  2. The additional ability to select either first or last value.
  3. The additional ability to declare a default value in case the observable didn't emit any value at all like so await lastValueFrom(data$, {defaultValue: 'Some default value'})

For more about this checkout the video below:
https://www.youtube.com/watch?v=3aeK5SfWBSU

like image 13
Tariq Saeed Avatar answered Oct 16 '22 09:10

Tariq Saeed


Code example:

Deprecated use:

await this.http.post<boolean>(`/someApi`).toPromise()
  .then((value) => {
    console.log(`Result: ` + value);
  })

New code:

import { firstValueFrom } from 'rxjs';

await firstValueFrom(this.http.post<boolean>(`/someApi`))
  .then((value) => {
    console.log(`Result: ` + value);
  }

)

like image 6
Adir D Avatar answered Oct 16 '22 08:10

Adir D