ที่คล้ายกันมองหาคำตอบที่ถูก downvoted แต่ฉันคิดว่าฉันสามารถพิสูจน์สิ่งที่ฉันแนะนำที่นี่สำหรับกรณีที่ จำกัด
แม้ว่าจะเป็นความจริงที่ว่าสิ่งที่สังเกตได้ไม่มีค่าปัจจุบันบ่อยครั้งมากที่มันจะมีค่าที่สามารถใช้ได้ทันที ตัวอย่างเช่นกับร้านค้า redux / flux / akita คุณอาจขอข้อมูลจากร้านค้าส่วนกลางตามจำนวนของสิ่งที่สังเกตได้และโดยทั่วไปค่านั้นจะพร้อมใช้งานทันที
หากเป็นกรณีนี้เมื่อsubscribe
คุณค่าจะกลับมาทันที
ดังนั้นสมมติว่าคุณมีการเรียกใช้บริการและเมื่อเสร็จแล้วคุณต้องการรับค่าล่าสุดของบางอย่างจากร้านค้าของคุณซึ่งอาจไม่ส่งผล :
คุณอาจลองทำเช่นนี้ (และคุณควรทำสิ่งที่ 'อยู่ในท่อ' ให้มากที่สุด):
serviceCallResponse$.pipe(withLatestFrom(store$.select(x => x.customer)))
.subscribe(([ serviceCallResponse, customer] => {
// we have serviceCallResponse and customer
});
ปัญหาเกี่ยวกับสิ่งนี้คือมันจะบล็อกจนกว่าสิ่งที่สังเกตได้รองจะปล่อยค่าซึ่งอาจไม่เคยเกิดขึ้นมาก่อน
ฉันพบว่าตัวเองเพิ่งจะต้องประเมินสิ่งที่สังเกตได้ก็ต่อเมื่อค่านั้นพร้อมใช้งานในทันทีและที่สำคัญฉันต้องสามารถตรวจสอบได้หากไม่ได้ ฉันลงเอยด้วยการทำสิ่งนี้:
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');
}
});
โปรดทราบว่าสำหรับทุกข้อที่ฉันใช้subscribe
เพื่อรับค่า (ตามที่ @Ben อธิบาย) ไม่ได้ใช้คุณสมบัติแม้ว่าฉันมี.value
BehaviorSubject