异步 EventEmitter 的正确用法是什么?

Ste*_*ens 12 angular

我注意到 EventEmitter 可以配置为异步发出事件。

constructor(isAsync: boolean = false)
创建一个 EventEmitter 实例,它依赖于 isAsync,同步或异步传递事件。

(取自https://angular.io/api/core/EventEmitter

我的组件何时应该异步传递事件而不是使用默认行为?

Mir*_*nas 11

当您使用该isAsync选项时,从发出的每个事件EventEmitter都会被包裹起来setTimeout使其异步。

这是EventEmitter源代码的摘录:

this.__isAsync ? 
  (value: any) => { setTimeout(() => generatorOrNext.next(value)); } :
  (value: any) => { generatorOrNext.next(value); };
Run Code Online (Sandbox Code Playgroud)

它给你增加了什么价值?可能没有。Zone 的检查将在您的代码接收事件之前进行,然后在您的事件处理完毕后再次检查,为 CPU 创造更多工作。理论上你可以在两者之间挤一些自定义的东西,但即使是 angular team 也不推荐它。

在此处阅读有关推理的更多信息:https : //github.com/angular/angular/issues/6311

希望有帮助

  • **警告:** 如果您在组件中执行某些操作,随后会导致同一组件在引发异步事件之前消失,那么该事件的触发将不会执行任何操作。为什么?假设您有一个组件修改了全局状态,从而从 DOM 中删除了相同的组件。当您尝试引发事件时,什么也不会发生,因为当“setTimeout”返回时,组件已被删除,发射器将不再有任何订阅者!也可以获得竞赛条件。 (2认同)