Sebuah serupa mencari jawaban downvoted. Tapi saya pikir saya bisa membenarkan apa yang saya sarankan di sini untuk kasus-kasus terbatas.
Meskipun benar bahwa yang diamati tidak memiliki nilai saat ini , sangat sering itu akan memiliki nilai yang segera tersedia . Misalnya dengan toko redux / fluks / akita Anda dapat meminta data dari toko pusat, berdasarkan sejumlah yang dapat diobservasi dan nilai itu umumnya akan segera tersedia.
Jika demikian, maka ketika Anda subscribe, nilainya akan segera kembali.
Jadi misalkan Anda melakukan panggilan ke layanan, dan pada penyelesaian Anda ingin mendapatkan nilai terbaru dari sesuatu dari toko Anda, yang mungkin tidak akan memancarkan :
Anda mungkin mencoba melakukan ini (dan Anda harus sedapat mungkin menjaga barang-barang 'di dalam pipa'):
serviceCallResponse$.pipe(withLatestFrom(store$.select(x => x.customer)))
.subscribe(([ serviceCallResponse, customer] => {
// we have serviceCallResponse and customer
});
Masalah dengan ini adalah bahwa hal itu akan memblokir sampai yang diamati diamati nilai sekunder, yang berpotensi tidak pernah.
Saya menemukan diri saya baru-baru ini perlu mengevaluasi yang dapat diamati hanya jika nilai segera tersedia , dan yang lebih penting saya harus dapat mendeteksi jika tidak. Saya akhirnya melakukan ini:
serviceCallResponse$.pipe()
.subscribe(serviceCallResponse => {
// immediately try to subscribe to get the 'available' value
// note: immediately unsubscribe afterward to 'cancel' if needed
let customer = undefined;
// whatever the secondary observable is
const secondary$ = store$.select(x => x.customer);
// subscribe to it, and assign to closure scope
sub = secondary$.pipe(take(1)).subscribe(_customer => customer = _customer);
sub.unsubscribe();
// if there's a delay or customer isn't available the value won't have been set before we get here
if (customer === undefined)
{
// handle, or ignore as needed
return throwError('Customer was not immediately available');
}
});
Perhatikan bahwa untuk semua hal di atas saya menggunakan subscribeuntuk mendapatkan nilai (seperti @Ben membahas). Tidak menggunakan .valueproperti, bahkan jika saya punya BehaviorSubject.