如何在 angular 7 中管理多个 observable

How to manage multiple observable in angular 7

我有一个angualr 7应用程序,总共有20个传感器数据。我想使用 observable for selected 传感器 ID 每 5 秒接收一次数据。例如;

var sensorId = ""; // dynamically selected from the web UI
var sensorData$ = interval(5000).pipe()
sensorData$.subscribe() // etc..

我将 select 多个传感器,并开始使用间隔订阅获取数据。我怎样才能保留这些观察值?我该如何管理它?

此外,我可以随时添加任何传感器。

你可以使用 rxjs forkJoin

它将您所有的可观察对象组合成一个发出所有值的对象,因此您订阅了 forkJoin 发出的可观察对象,您可以向它添加管道运算符等

类似于:

let sensors = forkJoin(observable1, observable2)

sensors.subscribe(
   sensorData => {
      // You receive an object with your observables data
   }
)

如果您需要获取数量可变的可观察对象并发出不同的值,您可以这样使用 BehaviorSubject:

let sensors = new BehaviorSubject<Array<Observables<yourType>>([])

sensors.next([newArrayOfObservables])

sensors.subscribe(
    sensors$ => {
      sensor$.forEach(sensor => {
        sensor.subscribe( // Do your logic)
      }
    }
)

这样你可以 add/remove observables,因为 ForkJoin 只在 observables 完成时发出值,它只发出一次值。

再次记得管理您的退订。

我建议使用 Subject 和 mergeMap。

至于解释,您将有 1 个主题,当用户从 UI 中选择一个时,您将在其中发出新的 sensorId。然后您需要订阅那个确切的主题,并且在 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);
}

这个合适吗?我会根据您的需要更新我的代码,请在评论区告诉我。