我有一个以 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 的 typescript ,因此会为 async/await 生成状态机。
如果我是对的,我如何确保调用不会重叠?我需要计算收到的值的平均值。
最佳答案
awaiting in there makes the emitter calls onNext() immediately because I've exited the method
你是对的。 Rx 忽略其订阅函数的返回类型,因此当它遇到第一个 await
时,它会忽略从 async
函数返回的 promise 。这意味着:
- 一旦另一个项目到达可观察对象,Rx 将再次调用您的订阅函数。它忽略了返回的 promise ,因此它不知道旧的调用仍在进行中。
- 来自
async
函数的异常将被忽略,因为 Promise 被忽略了。一些 Promise 库有一个全局的“未观察到的 Promise 错误”事件可以处理这个问题。
关于typescript - 使用异步函数订阅可观察对象是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55816172/