Junior — Middle
Тавзеҳ диҳед фарқияти байни Subject ва BehaviorSubject дар контексти барномасозии реактивӣ
sobes.tech AI
Ҷавоб аз AI
ในโปรแกรมมิ่งแบบรีแอกทีฟ โดยเฉพาะในไลบรารีอย่าง RxDart Subject และ BehaviorSubject เป็นชนิดพิเศษของสตรีม (Streams) ที่สามารถเป็นแหล่งข้อมูล (Observable) และผู้ฟัง (Observer) พร้อมกันได้
-
Subject เป็นสตรีมธรรมดาที่รับค่ามาใหม่และส่งต่อให้ผู้สมัครสมาชิก แต่ถ้าผู้สมัครสมาชิกเชื่อมต่อภายหลังจากที่ค่าถูกส่งไปแล้ว เขาจะไม่ได้รับค่าก่อนหน้านั้น
-
BehaviorSubject แตกต่างตรงที่มันเก็บค่าล่าสุดที่ส่งออกไปและส่งค่าดังกล่าวให้กับผู้สมัครสมาชิกใหม่ทันที ซึ่งเป็นประโยชน์เมื่อคุณต้องการให้ผู้สมัครสมาชิกใหม่ได้รับสถานะปัจจุบันทันที
ตัวอย่างใน Dart ด้วย RxDart:
import 'package:rxdart/rxdart.dart';
void main() {
final subject = PublishSubject<int>(); // PublishSubject เทียบเท่ากับ Subject
final behaviorSubject = BehaviorSubject<int>();
subject.add(1);
behaviorSubject.add(1);
subject.listen((value) => print('ผู้ฟัง Subject: $value'));
behaviorSubject.listen((value) => print('ผู้ฟัง BehaviorSubject: $value'));
subject.add(2);
behaviorSubject.add(2);
// ผลลัพธ์:
// ผู้ฟัง BehaviorSubject: 1
// ผู้ฟัง Subject: 2
// ผู้ฟัง BehaviorSubject: 2
}
จะเห็นว่า BehaviorSubject ส่งค่าล่าสุด (1) ให้กับผู้ฟังใหม่ทันที ในขณะที่ Subject ไม่ทำเช่นนั้น