1 Eksekusi / Konversi Langsung
Gunakan fromuntuk secara langsung mengonversi janji yang dibuat sebelumnya menjadi yang dapat diobservasi.
import { from } from 'rxjs';
// getPromise() will only be called once
const observable$ = from(getPromise());
observable$akan menjadi sesuatu yang dapat diobservasi panas yang secara efektif memutar kembali nilai janji kepada pelanggan.
Badan yang dijanjikan sedang dieksekusi atau telah diselesaikan ketika yang diamati diamati. Jika janji batin telah dipecahkan, pelanggan baru yang dapat diamati akan segera mendapatkan nilainya.
2 Eksekusi Ditangguhkan Pada Setiap Berlangganan
Gunakan deferdengan fungsi pabrik janji sebagai input untuk menunda pembuatan dan konversi janji menjadi yang dapat diobservasi.
import { defer } from 'rxjs';
// getPromise() will be called every time someone subscribes to the observable$
const observable$ = defer(() => getPromise());
observable$akan menjadi dingin yang bisa diamati .
Perbedaannya fromadalah bahwa defermenunggu pelanggan dan hanya kemudian menciptakan janji baru dengan memanggil fungsi pabrik janji yang diberikan. Ini berguna ketika Anda ingin membuat yang dapat diamati tetapi tidak ingin janji batin dieksekusi segera. Janji batin hanya akan dieksekusi ketika seseorang berlangganan yang dapat diamati. Setiap pelanggan juga akan mendapatkan diamati baru sendiri.
3 Banyak Operator Menerima Janji Secara Langsung
Kebanyakan operator RxJS yang menggabungkan (misalnya merge, concat, forkJoin, combineLatest...) atau mengubah diamati (misalnya switchMap, mergeMap, concatMap, catchError...) menerima janji-janji secara langsung. Jika Anda menggunakan salah satunya, Anda tidak harus menggunakan fromuntuk membungkus janji terlebih dahulu (tetapi untuk membuat dingin dapat diamati Anda masih harus menggunakandefer ).
// Execute two promises simultaneously
forkJoin(getPromise(1), getPromise(2)).pipe(
switchMap(([v1, v2]) => v1.getPromise(v2)) // map to nested Promise
)
Periksa dokumentasi atau implementasi untuk melihat apakah operator yang Anda gunakan menerima ObservableInputatau 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>;
Perbedaan antara fromdan deferdalam contoh: 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);
frommetode pengembalian dapat diamati tetapi mengirimkan janji sebagai nilai untuk langganan. :(