typescript - 使用异步函数订阅可观察对象是否安全

标签 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 的 typescript ,因此会为 async/await 生成状态机。

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

最佳答案

awaiting in there makes the emitter calls onNext() immediately because I've exited the method

你是对的。 Rx 忽略其订阅函数的返回类型,因此当它遇到第一个 await 时,它会忽略从 async 函数返回的 promise 。这意味着:

  1. 一旦另一个项目到达可观察对象,Rx 将再次调用您的订阅函数。它忽略了返回的 promise ,因此它不知道旧的调用仍在进行中。
  2. 来自 async 函数的异常将被忽略,因为 Promise 被忽略了。一些 Promise 库有一个全局的“未观察到的 Promise 错误”事件可以处理这个问题。

关于typescript - 使用异步函数订阅可观察对象是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55816172/

相关文章:

angular - RxJS - 使用 forEach 的多个请求并等待全部完成

rxjs - 延迟 Rxjs BehaviorSubject 机制

TypeScript 在设置属性后错误地假设它的值

angular - ng build 和 ngc 有什么关系和区别

javascript - 如何在给定范围的范围内拆分数字

asp.net-mvc - 如何在 Asp.Net MVC 的异步任务中返回 View 和模型

javascript - 函数缺少结束返回语句且返回类型不包括 'undefined'

angular - 如何避免 Angular 9 中复杂 RxJS 管道的内存泄漏?

javascript - Typescript 中的函数向量

c# - 我应该为我的 GUI 应用程序使用异步 "all the way"吗?