Sobes.tech
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 ไม่ทำเช่นนั้น