1 Esecuzione / conversione diretta
Utilizzare from
per convertire direttamente una promessa precedentemente creata in osservabile.
import { from } from 'rxjs';
// getPromise() will only be called once
const observable$ = from(getPromise());
observable$
sarà un osservabile a caldo che ripropone efficacemente il valore delle promesse agli abbonati.
Il corpo delle promesse viene eseguito o è già stato risolto quando viene creato l'osservabile. Se la promessa interiore è stata risolta, un nuovo abbonato all'osservabile otterrà immediatamente il suo valore.
2 Esecuzione differita su ogni iscrizione
Utilizzare defer
con una funzione promessa di fabbrica come input per differire la creazione e la conversione di una promessa in osservabile.
import { defer } from 'rxjs';
// getPromise() will be called every time someone subscribes to the observable$
const observable$ = defer(() => getPromise());
observable$
sarà un freddo osservabile .
La differenza from
è che defer
aspetta un abbonato e solo allora crea una nuova promessa chiamando la funzione di fabbrica promessa data. Questo è utile quando vuoi creare un osservabile ma non vuoi che la promessa interiore venga eseguita immediatamente. La promessa interiore sarà eseguita solo quando qualcuno si iscriverà all'osservabile. Ogni abbonato riceverà anche il proprio nuovo osservabile.
3 Molti operatori accettano direttamente le promesse
La maggior parte degli operatori che combinano RxJS (ad esempio merge
, concat
, forkJoin
, combineLatest
...) o trasformare osservabili (ad esempio switchMap
, mergeMap
, concatMap
, catchError
...) accettano direttamente promesse. Se stai usando uno di essi comunque non devi usare from
per concludere una promessa (ma per creare un osservabile a freddo potresti ancora usare defer
).
// Execute two promises simultaneously
forkJoin(getPromise(1), getPromise(2)).pipe(
switchMap(([v1, v2]) => v1.getPromise(v2)) // map to nested Promise
)
Controlla la documentazione o l' implementazione per vedere se l'operatore che stai utilizzando accetta ObservableInput
o 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>;
La differenza tra from
e defer
in un esempio: 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
metodo restituisce osservabile ma sta inviando promessa come valore agli abbonamenti. :(