使用异步功能订阅可观察对象是否安全

时间:2019-04-23 17:04:39

标签: typescript async-await rxjs

我有一个事件发射器,它以50Hz的频率发送事件。 我想使用异步方法订阅此发射器。该代码如下所示:

this.emitter = fromEventPattern(this.addHandler, this.removeHandler, (err, char) => [err, char]);
this.rxSubscription = this.emitter.subscribe(this.handleUpdatedValuesComingFromSensor);

       handleUpdatedValuesComingFromSensor = async (arr: any[]): Promise<void> => {
   ...
   await someMethodAsync();
   ...
}

我可能错了,但是我的印象是,在那儿等待使发射器立即退出onNext(),因为我已经退出了该方法。

由于事件发生率,使用控制台调用进行调试非常困难。

我是对还是错?

感谢您的帮助。

编辑1

我正在使用面向ES2015的打字稿,因此为异步/等待生成了状态机。

如果我是对的,如何确保通话不会重叠?我需要计算收到的值的平均值。

2 个答案:

答案 0 :(得分:0)

我不清楚您的担忧是什么。这是有效的,您的方法将为每个元素调用一次。它不会跳过任何内容或中途中断您的方法,但是:

  1. 它不会等待handleUpdatedValuesComingFromSensor的一个迭代完成才开始另一个迭代(假定handleUpdatedValuesComingFromSensor确实是异步的),因此您可以同时运行多个handleUpdatedValuesComingFromSensor实例时间。
  2. 类似地,如果您有多个订阅者,则它将不等待handleUpdatedValuesComingFromSensor完成,然后再将事件发送给下一个订阅者。

答案 1 :(得分:0)

  

在其中等待使发射器立即调用onNext(),因为我已经退出了该方法

您是正确的。 Rx忽略其订阅函数的返回类型,因此当它到达其第一个async时,它将忽略从您的await函数返回的promise。这意味着:

  1. 一旦其他项目到达可观察对象,Rx将再次调用您的订阅功能。它忽略了返回的承诺,因此它不知道旧的调用仍在进行中。
  2. async函数中的异常将被忽略,因为Promise被忽略了。一些承诺库具有可解决此问题的全局“未观察到的承诺错误”事件。