1 Exécution / conversion directe
Permet fromde convertir directement une promesse précédemment créée en une observable.
import { from } from 'rxjs';
// getPromise() will only be called once
const observable$ = from(getPromise());
observable$sera un observable à chaud qui relit efficacement la valeur des promesses pour les abonnés.
Le corps des promesses est en cours d'exécution ou a déjà été résolu lors de la création de l'observable. Si la promesse intérieure a été résolue, un nouvel abonné à l'observable obtiendra immédiatement sa valeur.
2 Exécution différée sur chaque abonnement
Utiliser deferavec une fonction d'usine de promesse comme entrée pour différer la création et la conversion d'une promesse en observable.
import { defer } from 'rxjs';
// getPromise() will be called every time someone subscribes to the observable$
const observable$ = defer(() => getPromise());
observable$sera un froid observable .
La différence avec from est deferqu'attend un abonné et crée ensuite une nouvelle promesse en appelant la fonction d'usine de promesse donnée. Ceci est utile lorsque vous souhaitez créer un observable mais que vous ne voulez pas que la promesse intérieure soit exécutée immédiatement. La promesse intérieure ne sera exécutée que lorsque quelqu'un souscrira à l'observable. Chaque abonné recevra également son propre nouvel observable.
3 De nombreux opérateurs acceptent directement les promesses
La plupart des opérateurs de RxJS qui combinent (par exemple merge, concat, forkJoin, combineLatest...) ou transformer observables (par exemple switchMap, mergeMap, concatMap, catchError...) accepter des promesses directement. Si vous utilisez l'un d'eux de toute façon, vous n'avez pas à utiliser frompour envelopper une promesse en premier (mais pour créer un observable froid, vous devrez peut-être encore utiliser defer).
// Execute two promises simultaneously
forkJoin(getPromise(1), getPromise(2)).pipe(
switchMap(([v1, v2]) => v1.getPromise(v2)) // map to nested Promise
)
Vérifiez la documentation ou l' implémentation pour voir si l'opérateur que vous utilisez accepte ObservableInputou 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 différence entre fromet deferdans un exemple: 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);
fromméthode retourne observable mais envoie une promesse comme valeur aux abonnements. :(