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
метод повернення спостерігається, але він надсилає обіцянку як значення для підписок. :(