1 Bezpośrednie wykonanie / konwersja
Służy from
do bezpośredniego konwertowania wcześniej utworzonej obietnicy na obserwowalne.
import { from } from 'rxjs';
// getPromise() will only be called once
const observable$ = from(getPromise());
observable$
będzie gorący do zaobserwowania który skutecznie odtworzy wartość obietnic dla subskrybentów.
Ciało obietnic jest wykonywane lub zostało już rozwiązane podczas tworzenia obserwowalnego. Jeśli wewnętrzna obietnica została rozwiązana, nowy subskrybent obserwowalnego natychmiast uzyska swoją wartość.
2 Odroczone wykonanie każdego subskrypcji
Użyj defer
z funkcją fabryki obietnic jako danych wejściowych, aby odroczyć tworzenie i przekształcanie obietnicy w obserwowalne.
import { defer } from 'rxjs';
// getPromise() will be called every time someone subscribes to the observable$
const observable$ = defer(() => getPromise());
observable$
będzie zimno obserwowalny .
Różnica from
polega na tym, żedefer
czeka na subskrybenta, a dopiero potem tworzy nową obietnicę, wywołując daną funkcję fabryki obietnic. Jest to przydatne, gdy chcesz stworzyć obserwowalne, ale nie chcesz od razu wykonać wewnętrznej obietnicy. Wewnętrzna obietnica zostanie wykonana tylko wtedy, gdy ktoś zasubskrybuje to, co obserwowalne. Każdy subskrybent otrzyma także własny nowy obserwowalny.
3 Wielu operatorów bezpośrednio przyjmuje obietnice
Większość RxJS podmioty, które łączą (np merge
, concat
, forkJoin
, combineLatest
...) lub przekształcić obserwable (np switchMap
, mergeMap
, concatMap
, catchError
...) przyjąć obietnice bezpośrednio. Jeśli i tak używasz jednego z nich, nie musisz from
najpierw zawijać obietnicy (ale aby stworzyć zimny obserwowalny , nadal będziesz musiał skorzystać defer
).
// Execute two promises simultaneously
forkJoin(getPromise(1), getPromise(2)).pipe(
switchMap(([v1, v2]) => v1.getPromise(v2)) // map to nested Promise
)
Sprawdź dokumentację lub implementację, aby sprawdzić, czy używany operator akceptuje ObservableInput
lub 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>;
Różnica między from
i defer
w przykładzie: 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
metoda zwraca obserwowalny, ale wysyła obietnicę jako wartość do subskrypcji. :(