如何管理角度7中的多个可观察对象

时间:2019-07-17 10:38:45

标签: javascript angular typescript rxjs angular7

我有一个Angualr 7应用程序,总共20个传感器数据。我想每隔5秒使用可观察到的选定传感器ID接收数据。例如;

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

我将选择多个传感器,并开始使用间隔订阅来获取数据。我如何保持这些观测值?我该如何管理?

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

2 个答案:

答案 0 :(得分:1)

我建议使用Subject和mergeMap。

作为说明,您将拥有1个主题,当用户从UI中选择一个主题时,将在其中发射新的sensorId。然后,您需要订阅该确切的Subject,并在mergeMap的帮助下,您的subscription方法中将包含所有传感器值。

让我们看一下演示代码:

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);
}

这合适吗?我将根据您的需要更新代码,只需在评论部分告诉我。

答案 1 :(得分:0)

您可以使用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)
      }
    }
)

通过这种方式,您可以添加/删除可观察对象,因为ForkJoin仅在可观察对象完成时才发出值。

再次记住要管理您的退订。