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?
Rxjs toPromise() veraltet
Pawan Sharma
Warum passiert das?
Wie erwähnt Hierdas sind die Hauptgründe dafür toPromise
ist veraltet:
Ein Ziel war es, es aus dem zu entfernen
Observable
Prototyp erstellen und ihn in eine eigenständige Util-Funktion umwandeln.Die Benennung von
toPromise
ist nicht das Beste. Besonders in Kombination mitawait
es liest sich nicht sehr gut:await categories$.toPromise()
vsawait lastValueFrom(categories$)
Die Typinformationen von
toPromise
ist falsch. Wenn die QuelleObservable
abgeschlossen, ohne jemals einen einzigen Wert auszugeben – es wurde mit aufgelöstundefined
. Es sollte in diesem Fall ablehnen. APromise
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 hatundefined
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:
- Die Benennung ist lesbarer und selbsterklärend.
- Die zusätzliche Möglichkeit, entweder den ersten oder den letzten Wert auszuwählen.
- 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
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);
})
Wie üblich werden die Alternativen in der Abwertung bereitgestellt: github.com/ReactiveX/rxjs/commit/…
– jonrsharpe
11. April 2021 um 11:23 Uhr