1 Direkte Ausführung / Konvertierung
Verwenden Sie from
diese Option, um ein zuvor erstelltes Versprechen direkt in ein Observable umzuwandeln.
import { from } from 'rxjs';
// getPromise() will only be called once
const observable$ = from(getPromise());
observable$
wird ein heißes Observable sein , das den Versprechungswert für Abonnenten effektiv wiedergibt.
Der Versprechenskörper wird ausgeführt oder wurde bereits aufgelöst, als das Observable erstellt wurde. Wenn das innere Versprechen gelöst wurde, erhält ein neuer Abonnent des Observablen sofort seinen Wert.
2 Aufgeschobene Ausführung bei jedem Abonnement
Verwenden Sie diese Funktion defer
mit einer Versprechen-Factory-Funktion als Eingabe, um die Erstellung und Umwandlung eines Versprechens in ein Beobachtbares zu verschieben.
import { defer } from 'rxjs';
// getPromise() will be called every time someone subscribes to the observable$
const observable$ = defer(() => getPromise());
observable$
wird eine Erkältung zu beobachten sein .
Der Unterschied from
besteht darin, dass defer
auf einen Abonnenten gewartet wird und erst dann ein neues Versprechen erstellt wird, indem die angegebene Versprechen-Factory-Funktion aufgerufen wird. Dies ist nützlich, wenn Sie ein Observable erstellen möchten, aber nicht möchten, dass das innere Versprechen sofort ausgeführt wird. Das innere Versprechen wird nur ausgeführt, wenn jemand das Beobachtbare abonniert. Jeder Abonnent erhält außerdem seine eigene neue Beobachtungsgröße.
3 Viele Betreiber akzeptieren Versprechen direkt
Die meisten RxJS Operatoren , die kombinieren (zB merge
, concat
, forkJoin
, combineLatest
...) oder verwandeln Observablen (zB switchMap
, mergeMap
, concatMap
, catchError
...) direkt Versprechen akzeptieren. Wenn Sie eines davon trotzdem verwenden, müssen Sie es nicht verwenden from
, um zuerst ein Versprechen zu verpacken (aber um ein kaltes Observable zu erstellen, müssen Sie es möglicherweise noch verwenden defer
).
// Execute two promises simultaneously
forkJoin(getPromise(1), getPromise(2)).pipe(
switchMap(([v1, v2]) => v1.getPromise(v2)) // map to nested Promise
)
Überprüfen Sie die Dokumentation oder Implementierung, um festzustellen, ob der von Ihnen verwendete Operator ObservableInput
oder akzeptiert SubscribableOrPromise
.
type ObservableInput<T> = SubscribableOrPromise<T> | ArrayLike<T> | Iterable<T>;
// Note the PromiseLike ----------------------------------------------------v
type SubscribableOrPromise<T> = Subscribable<T> | Subscribable<never> | PromiseLike<T> | InteropObservable<T>;
Der Unterschied zwischen from
und defer
in einem Beispiel: https://stackblitz.com/edit/rxjs-6rb7vf
const getPromise = val => new Promise(resolve => {
console.log('Promise created for', val);
setTimeout(() => resolve(`Promise Resolved: ${val}`), 5000);
});
// the execution of getPromise('FROM') starts here, when you create the promise inside from
const fromPromise$ = from(getPromise('FROM'));
const deferPromise$ = defer(() => getPromise('DEFER'));
fromPromise$.subscribe(console.log);
// the execution of getPromise('DEFER') starts here, when you subscribe to deferPromise$
deferPromise$.subscribe(console.log);
from
Methode Observable zurück, sendet jedoch Versprechen als Wert an Abonnements. :(