Rxjs toPromise() veraltet

Lesezeit: 2 Minuten

Das habe ich gelesen toPromise() ist in RxJS 7 veraltet und wird in RxJS 8 entfernt. Ich habe es oft mit der asynchronen Wait-Syntax in Angular verwendet, um http-Aufrufe abzuwickeln. Gilt es als Anti-Muster? Ich verstehe das Konzept von Streams, aber ein http-Aufruf gibt nur einen einzigen Wert aus. Ich verstehe den Sinn von Observable für einen einfachen http-Aufruf nicht. Was soll ich als nächstes verwenden? Sollte ich die reaktive Programmierung voll und ganz annehmen?

Pawan Sharmas Benutzeravatar
Pawan Sharma

Warum passiert das?

Wie erwähnt Hierdas sind die Hauptgründe dafür toPromise ist veraltet:

  1. Ein Ziel war es, es aus dem zu entfernen Observable Prototyp erstellen und ihn in eine eigenständige Util-Funktion umwandeln.

  2. Die Benennung von toPromise ist nicht das Beste. Besonders in Kombination mit await es liest sich nicht sehr gut: await categories$.toPromise() vs await lastValueFrom(categories$)

  3. Die Typinformationen von toPromise ist falsch. Wenn die Quelle Observable abgeschlossen, ohne jemals einen einzigen Wert auszugeben – es wurde mit aufgelöst undefined. Es sollte in diesem Fall ablehnen. A Promise ist ein „Versprechen“, dass, wenn es aufgelöst wird, ein Wert da sein wird – und zwar dieser
    undefined. Wenn der Stream jedoch abgeschlossen wird, ohne jemals einen Wert auszugeben, können Sie nicht zwischen einem Stream unterscheiden, der einen ausgegeben hat undefined absichtlich und ein Stream, der abgeschlossen wurde, ohne jemals mehr zu emittieren

Was sollten Sie als nächstes verwenden?

Wenn Sie wirklich darauf bestehen, es wie versprochen zu tun, lastValueFrom/firstValueFrom. Andernfalls wäre die Umstellung auf reaktive Programmierung der richtige Weg.

Benutzen toPromise ( veraltet ) –

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

Benutzen lastValueFrom ( neu ) –

import { lastValueFrom } from 'rxjs';

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

Dieser Link sollte helfen –

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

  • Danke für die Antwort und den Link, es war das, wonach ich gesucht habe

    – Matias

    11. April 2021 um 11:49 Uhr

firstValueFrom Und lastValueFrom ist aus vielen Gründen definitiv eine bessere Alternative:

  1. Die Benennung ist lesbarer und selbsterklärend.
  2. Die zusätzliche Möglichkeit, entweder den ersten oder den letzten Wert auszuwählen.
  3. Die zusätzliche Möglichkeit, einen Standardwert zu deklarieren, falls das Observable auf diese Weise überhaupt keinen Wert ausgegeben hat await lastValueFrom(data$, {defaultValue: 'Some default value'})

Weitere Informationen hierzu finden Sie im folgenden Video:
https://www.youtube.com/watch?v=3aeK5SfWBSU

Benutzeravatar von Adir D
Adir D

Codebeispiel:

Veraltete Verwendung:

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

Neuer Code:

import { firstValueFrom } from 'rxjs';

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

1453650cookie-checkRxjs toPromise() veraltet

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy