1 Пряме виконання / перетворення
Використовуйте fromдля прямого перетворення створеної раніше обіцянки в спостережувану.
import { from } from 'rxjs';
// getPromise() will only be called once
const observable$ = from(getPromise());
observable$буде гарячим спостереженням яке ефективно відтворює передплачені значення обіцянок.
Орган обіцянок виконується або вже був вирішений, коли створене спостережуване. Якщо внутрішня обіцянка була вирішена, новий абонент спостережуваного отримає свою вартість негайно.
2 Відкладене виконання на кожну підписку
Використовуйте deferз фабричною функцією для обіцянки як вхід, щоб відкласти створення та перетворення обіцянки на спостережуване.
import { defer } from 'rxjs';
// getPromise() will be called every time someone subscribes to the observable$
const observable$ = defer(() => getPromise());
observable$буде спостереження за холодом .
Різниця fromполягає в тому, що він deferчекає абонента і лише потім створює нову обіцянку, викликаючи дану функцію заводу обіцянки. Це корисно, коли ви хочете створити спостережуване, але не хочете, щоб внутрішня обіцянка була виконана відразу. Внутрішня обіцянка буде виконана лише тоді, коли хтось підписується на спостережуване. Кожен абонент також отримає свою нову спостережувану систему.
3 Багато операторів приймають обіцянки безпосередньо
Більшість RxJS операторів , які поєднують в собі (наприклад merge, concat, forkJoin, combineLatest...) або перетворити Спостережувані (наприклад switchMap, mergeMap, concatMap, catchError...) приймає обіцянки безпосередньо. Якщо ви все одно використовуєте один з них, вам не доведеться спочатку fromвиконувати обіцянку (але для створення холодного спостереження ви все ще можете використовувати defer).
// Execute two promises simultaneously
forkJoin(getPromise(1), getPromise(2)).pipe(
switchMap(([v1, v2]) => v1.getPromise(v2)) // map to nested Promise
)
Перевірте документацію або реалізацію , щоб побачити , якщо оператор ви використовуєте приймає ObservableInputабо 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>;
Різниця між fromі deferв прикладі: 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метод повернення спостерігається, але він надсилає обіцянку як значення для підписок. :(