1 Eksekusi / Konversi Langsung
Gunakan from
untuk 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 defer
dengan 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 from
adalah bahwa defer
menunggu 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 from
untuk 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 ObservableInput
atau 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 from
dan defer
dalam 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);
from
metode pengembalian dapat diamati tetapi mengirimkan janji sebagai nilai untuk langganan. :(