我有一个事件发射器,它以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的打字稿,因此为异步/等待生成了状态机。
如果我是对的,如何确保通话不会重叠?我需要计算收到的值的平均值。
答案 0 :(得分:0)
我不清楚您的担忧是什么。这是有效的,您的方法将为每个元素调用一次。它不会跳过任何内容或中途中断您的方法,但是:
handleUpdatedValuesComingFromSensor
的一个迭代完成才开始另一个迭代(假定handleUpdatedValuesComingFromSensor
确实是异步的),因此您可以同时运行多个handleUpdatedValuesComingFromSensor
实例时间。handleUpdatedValuesComingFromSensor
完成,然后再将事件发送给下一个订阅者。答案 1 :(得分:0)
在其中等待使发射器立即调用onNext(),因为我已经退出了该方法
您是正确的。 Rx忽略其订阅函数的返回类型,因此当它到达其第一个async
时,它将忽略从您的await
函数返回的promise。这意味着:
async
函数中的异常将被忽略,因为Promise被忽略了。一些承诺库具有可解决此问题的全局“未观察到的承诺错误”事件。