Persyaratan: Proyek perlu mengonversi Observables ke Promises dan menunggu penyelesaian, dan saat menggunakan metode toPromise() dalam proyek Angular, petunjuk telah tidak digunakan lagi, dan kemudian disarankan untuk menggunakan metode statis firstValueFrom atau lastValueFrom.
Mengapa menghentikan metode toPromise()?
Karena nama metode toPromise() tidak pernah menunjukkan nilai mana yang dipancarkan yang akan diselesaikan oleh Promise, karena Observables dapat menghasilkan beberapa nilai dari waktu ke waktu. Saat mengonversi ke Promise, Anda mungkin ingin memilih apakah Anda ingin memilih nilai pertama yang akan tiba atau nilai terakhir. Untuk mengatasi semua masalah ini, kami memutuskan untuk menghentikan toPromise() dan memperkenalkan dua fungsi pembantu baru untuk mengonversi menjadi promise.
Cukup pahamiObservables menghasilkan banyak nilaiLaluJanji hanya akan menghasilkan satu nilaiKemudian, beberapa pengguna ingin menggunakan nilai pertama, dan beberapa pengguna ingin menggunakan nilai terakhir, sehingga firstValueFrom dan lastValueFrom muncul. (Catatan: toPromise() adalah nilai terakhir untuk mendapatkan observable)
firstValueFrom contoh
Anda mungkin ingin mendapatkan nilai pertama saat tiba tanpa menunggu Observable selesai, sehingga Anda dapat menggunakan firstValueFrom. firstValueFrom akan menyelesaikan Promise dengan nilai pertama yang dipancarkan oleh Observable dan segera berhenti berlangganan untuk mempertahankan sumber daya. Jika Observable selesai tanpa memancarkan nilai apa pun, firstValueFrom juga akan ditolak dengan EmptyError.
lastValueFrom contoh
lastValueFrom hampir identik dengan toPromise(), yang berarti akan mengurai dengan nilai terakhir yang dicapai saat Observable selesai, tetapi berperilaku berbeda saat Observable selesai tanpa memancarkan satu nilai pun. Ketika Observable selesai tanpa diaktifkan, toPromise() akan berhasil diselesaikan menjadi undefined (sehingga jenis pengembalian berubah), dan lastValueFrom akan ditolak sebagai EmptyError. Oleh karena itu, jenis pengembalian lastValueFrom adalah Promise<T>, seperti toPromise() di RxJS 6.
Contoh penguraian
Dalam RxJS, interval(1000) menghasilkan observable yang memancarkan urutan angka bertahap setiap 1000 milidetik (yaitu, 1 detik), mulai dari 0.
Selanjutnya, .pipe(take(10)) adalah rantai operator yang membatasi jumlah elemen yang dipancarkan Observable. Di sini, take(10) berarti bahwa hanya nilai dari 10 yang pertama dipancarkan yang diambil.
Mari kita jelaskan ungkapan ini secara rinci:
interval(1000): Buat observable yang memancarkan angka setiap 1 detik. Urutan angka dimulai dari 0 dan bertambah 1 setiap kali.
.pipe(take(10)): Gunakan metode .pipe() untuk menghubungkan beberapa operator. Di sini kita menggunakan operator take(10), yang membatasi Observable untuk hanya memancarkan 10 nilai pertama.
Uji kesalahan EmptyError
Kodenya adalah sebagai berikut:
atau
Referensi:Login hyperlink terlihat. |