![](/img/trans.png)
[英]Angular Rxjs: How to handle multiple events that affects a base observable stream
[英]How to manage multiple observable in angular 7
我有一个 angualr 7 应用程序,总共有 20 个传感器数据。 我想使用 observable 为选定的传感器 id 每 5 秒接收一次数据。 例如;
var sensorId = ""; // dynamically selected from the web UI
var sensorData$ = interval(5000).pipe()
sensorData$.subscribe() // etc..
我将选择多个传感器,并开始使用间隔订阅获取数据。 我怎样才能保持这些可观察的? 我该如何管理?
此外,我可以随时添加任何传感器。
我建议使用Subject 和mergeMap。
至于解释,您将有 1 个主题,当用户从 UI 中选择一个时,您将在其中发出新的传感器 ID。 然后您需要订阅那个确切的主题,并且在 mergeMap 的帮助下,您将拥有订阅方法中的所有传感器值。
让我们看看演示代码:
private sensorIdSubject = new Subject();
ngOnInit() {
this.sensorIdSubject.pipe(
mergeMap(sensorId =>
interval(5000).pipe(switchMap(() => this.getSensorData(sensorId)))
).subscribe(sensorData => {
// Every 5 second, each of the sensorIds that have been selected in UI will
// get sensor data and emit new value here in subscribe, because all of them
// have been merged.
})
}
public chooseSensor(sensorId) {
this.sensorIdSubject.next(sensorId);
}
这个合适吗? 我会根据您的需要更新我的代码,请在评论部分告诉我。
您可以使用 rxjs forkJoin
它将您所有的 observable 组合成一个发出所有值的对象,因此您订阅了 forkJoin 发出的 observable,您可以向其中添加管道运算符等
就像是:
let sensors = forkJoin(observable1, observable2)
sensors.subscribe(
sensorData => {
// You receive an object with your observables data
}
)
如果您需要获取发出不同值的可变数量的 observables,您可以这样使用 BehaviorSubject:
let sensors = new BehaviorSubject<Array<Observables<yourType>>([])
sensors.next([newArrayOfObservables])
sensors.subscribe(
sensors$ => {
sensor$.forEach(sensor => {
sensor.subscribe( // Do your logic)
}
}
)
通过这种方式,您可以添加/删除 observables,因为 ForkJoin 仅在 observables 完成时才发出值,它只发出一次值。
再次记住管理您的退订。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.