สัปดาห์ที่แล้วฉันตอบคำถาม RxJS ที่ฉันได้พูดคุยกับสมาชิกชุมชนคนอื่นเกี่ยวกับ: "ฉันควรสร้างการสมัครรับข้อมูลสำหรับผลข้างเคียงที่เฉพาะเจาะจงทุกอย่างหรือฉันควรพยายามลดการสมัครสมาชิกให้น้อยที่สุด?" ฉันต้องการทราบว่าจะใช้ methology ใดในแง่ของวิธีการแอปพลิเคชั่นที่มีปฏิกิริยาเต็มรูปแบบหรือเมื่อใดที่จะเปลี่ยนจากที่หนึ่งไปยังอีกที่หนึ่ง สิ่งนี้จะช่วยฉันและคนอื่น ๆ ในการหลีกเลี่ยงการอภิปรายที่ไม่จำเป็น
ข้อมูลการตั้งค่า
- ตัวอย่างทั้งหมดอยู่ใน TypeScript
- เพื่อมุ่งเน้นคำถามที่ดีกว่าไม่มีการใช้วงจรชีวิต / ตัวสร้างสำหรับการสมัครสมาชิกและเพื่อให้อยู่ในกรอบที่ไม่เกี่ยวข้อง
- ลองนึกภาพ: การสมัครสมาชิกถูกเพิ่มใน constructor / lifecycle init
- ลองนึกภาพ: การยกเลิกการสมัครสมาชิกทำในช่วงเวลาทำลายล้าง
ผลข้างเคียงคืออะไร (ตัวอย่างเชิงมุม)
- อัปเดต / อินพุตใน UI (เช่น
value$ | async
) - เอาท์พุท / ต้นน้ำขององค์ประกอบ (เช่น
@Output event = event$
) - การโต้ตอบระหว่างบริการต่าง ๆ ในลำดับชั้นที่แตกต่างกัน
ตัวอย่างที่เป็นประโยชน์:
- สองฟังก์ชั่น:
foo: () => void; bar: (arg: any) => void
- แหล่งข้อมูลที่สังเกตได้สองแหล่ง:
http$: Observable<any>; click$: Observable<void>
foo
ถูกเรียกหลังจากhttp$
ปล่อยออกมาและไม่ต้องการค่าใด ๆbar
ถูกเรียกหลังจากclick$
ปล่อยออกมา แต่ต้องการค่าปัจจุบันของhttp$
กรณี: สร้างการสมัครรับข้อมูลสำหรับผลข้างเคียงที่เฉพาะเจาะจงทุกรายการ
const foo$ = http$.pipe(
mapTo(void 0)
);
const bar$ = http$.pipe(
switchMap(httpValue => click$.pipe(
mapTo(httpValue)
)
);
foo$.subscribe(foo);
bar$.subscribe(bar);
กรณี: ลดการสมัครรับข้อมูลให้น้อยที่สุดโดยทั่วไป
http$.pipe(
tap(() => foo()),
switchMap(httpValue => click$.pipe(
mapTo(httpValue )
)
).subscribe(bar);
ความเห็นของฉันเองในระยะสั้น
ฉันสามารถเข้าใจความจริงที่ว่าการสมัครสมาชิกทำให้ภูมิทัศน์ Rx ซับซ้อนขึ้นในตอนแรกเพราะคุณต้องคิดว่าสมาชิกควรมีผลต่อไพพ์หรือไม่เช่นนั้น (แชร์ให้คุณสังเกตได้หรือไม่) แต่ยิ่งคุณแยกรหัสของคุณออกมามากเท่าใด (ยิ่งคุณเน้นมากขึ้น: เกิดอะไรขึ้นเมื่อ) ยิ่งรักษารหัสของคุณได้ง่ายขึ้นในอนาคต โดยที่ในใจฉันมักจะสร้างแหล่งที่สังเกตได้เดียวและการสมัครสมาชิกเดียวสำหรับผลข้างเคียงใด ๆ ในรหัสของฉัน หากมีผลข้างเคียงสองอย่างขึ้นไปที่ฉันถูกกระตุ้นจากแหล่งข้อมูลเดียวกันที่สังเกตได้ฉันจะแบ่งปันสิ่งที่สังเกตได้และสมัครสมาชิกผลข้างเคียงแต่ละอันเพราะมันสามารถมีวงจรชีวิตที่แตกต่างกัน