`BehaviorSubject` 和 `Subject` 的行为对比

4 阅读1分钟

BehaviorSubjectSubject 的行为对比:

BehaviorSubject

  • 行为: 每个新的订阅者在订阅时,都会立即接收到最近一次发出的值(即使是在订阅之前发出的)。
  • 适用场景: 当你希望所有新的订阅者都能获得最近的状态或数据时,BehaviorSubject 是理想的选择。

Subject

  • 行为: Subject 只会将从调用 next() 之后的值发送给当前订阅者。也就是说,只有当订阅者在 next() 之后才会接收到数据。
  • 适用场景: 当你只关心在某一时刻之后的数据,而不关心之前的数据时,Subject 是一个好的选择。

示例代码对比

使用 BehaviorSubject
import { BehaviorSubject } from 'rxjs';

const weatherSubject = new BehaviorSubject({ temperature: 0, rainChance: 0 });
const sendWeatherData = (weatherData) => {
  weatherSubject.next(weatherData);
};

sendWeatherData({ temperature: 35.5, rainChance: 20 });
sendWeatherData({ temperature: 34, rainChance: 25 });

weatherSubject.subscribe((x) => {
  console.log("Current Temperature: " + x.temperature);
});

sendWeatherData({ temperature: 28, rainChance: 50 });

weatherSubject.subscribe((x) => {
  console.log("Chance of rain: " + x.rainChance);
});

sendWeatherData({ temperature: 25, rainChance: 90 });

输出:

Current Temperature: 34
Current Temperature: 28
Chance of rain: 50
Current Temperature: 25
Chance of rain: 90
使用 Subject
import { Subject } from 'rxjs';

const weatherSubject = new Subject();
const sendWeatherData = (weatherData) => {
  weatherSubject.next(weatherData);
};

sendWeatherData({ temperature: 35.5, rainChance: 20 });
sendWeatherData({ temperature: 34, rainChance: 25 });

weatherSubject.subscribe((x) => {
  console.log("Current Temperature: " + x.temperature);
});

sendWeatherData({ temperature: 28, rainChance: 50 });

weatherSubject.subscribe((x) => {
  console.log("Chance of rain: " + x.rainChance);
});

sendWeatherData({ temperature: 25, rainChance: 90 });

输出:

Current Temperature: 28
Current Temperature: 25
Chance of rain: 90

结论

  • BehaviorSubject: 新的订阅者会立即收到最近发出的值,所以在任何时间点订阅都能获得最新的数据。
  • Subject: 只有在 next() 之后订阅的订阅者才能接收到数据,之前的数据不会被发送给新订阅者。