BehaviorSubject
和 Subject
的行为对比:
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()
之后订阅的订阅者才能接收到数据,之前的数据不会被发送给新订阅者。