【问题标题】:Angular - Callback from Service after Component is destroyedAngular - 组件被销毁后从服务回调
【发布时间】:2019-01-28 13:35:47
【问题描述】:

我有一些关于 Angular 组件和 OnDestroy 生命周期钩子的小问题。

我有一个 Angular 服务和一个 Angular 组件。从组件中,我在服务中调用一个函数。因为函数不能直接返回结果,所以我使用回调来获取结果。我将回调作为组件内部的箭头函数传递。

我注意到,如果我执行调用服务内部函数的函数,然后 - 在调用回调之前 - 路由到另一个组件,因此当前组件被销毁,回调仍然在组件本身之后执行(其中包含作为箭头函数的回调)被销毁。

现在回答我的问题:

这在幕后是如何工作的? Angular 是否只销毁视图(模板)并等待回调被调用,然后销毁其余的(代码)?

还是说 ngOnDestroy 只销毁视图,其余的由垃圾收集/浏览器本身处理?

有什么方法可以检查组件是否仍然存在并且没有被销毁,然后才调用回调?

【问题讨论】:

  • 出于好奇,为什么服务不能返回直接结果?它是返回一个承诺还是其他异步结果?也许在这种情况下,您可以在控制器中有一个 true false 标志,该标志在回调完成时更新,如果为 true 则允许导航
  • Angular 永远不会“破坏代码”。 ngOnDestroy 是 Angular 销毁由该组件创建的 DOM 节点时调用的方法。函数调用仍在浏览器堆栈中,仍将被调用。
  • @Dale 对不起 :) 服务中的函数读取传递目录的条目并返回目录中的文件数组(我正在使用条目 API)。
  • @ritaj 感谢您澄清这一点。所以浏览器会在不再需要时收集其余的组件实例(代码等),或者这是如何工作的?
  • 好吧,当没有更多对象引用时,浏览器会收集对象实例。当onDestroy 发生时,Angular 将取消引用组件实例。在组件销毁之前调用的函数仍然会在堆栈上,因此组件还不会被回收。

标签: javascript html angular typescript


【解决方案1】:

在服务内部,您可以维护一个状态标志,如果组件被销毁,将设置 tp true。您可以在组件 ngOnDestroy 上将服务标志设置为 true。回调执行时,只有 flag 为 false 时才能继续执行。

根据官方 Angular 文档,当指令、管道、组件或服务被销毁时调用的 ondestroy 生命周期钩子。用于实例销毁时需要进行的任何自定义清理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 2012-08-14
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 2016-12-05
    • 2019-07-28
    相关资源
    最近更新 更多