javascript - 防止 Angular 2 中的内存泄漏?

标签 javascript angularjs memory-leaks angular rxjs

在 Angular 2 中,是否有任何关于内存管理的特定陷阱,我应该注意?

为了避免可能的泄漏,管理组件状态的最佳做法是什么?

具体来说,我见过一些人unsubscribing from HTTP observablesngOnDestroy 方法中。我应该一直这样做吗?

在 Angular 1.X 中,我知道当 $scope 被销毁时,其上的所有监听器也会自动销毁。 Angular 2 组件中的可观察对象怎么样?

@Component({
  selector: 'library',
  template: `
    <tr *ngFor="#book of books | async">
        <td>{{ book.title.text }}</td>
        <td>{{ book.author.text }}</td>
    </tr>
  `
})
export class Library {
    books: Observable<any>;

    constructor(private backend: Backend) {
        this.books = this.backend.get('/texts'); // <-- does it get destroyed
                                                 //     with the component?
    }
};

最佳答案

应@katspaugh 的要求

在您的特定情况下,无需手动取消订阅,因为这是异步管道的工作。

检查 source code对于异步管道。为简洁起见,我发布了相关代码

class AsyncPipe implements PipeTransform, OnDestroy {
    // ...
    ngOnDestroy(): void {
        if (isPresent(this._subscription)) {
          this._dispose();
        }
    }

如您所见,Async 管道实现了 OnDestroy,当它被销毁时,它会检查是否有一些订阅并将其删除。

在这种特定情况下,您将需要重新发明轮子(抱歉我重复了一遍)。这并不意味着您不能/不应该在任何其他情况下取消订阅,例如您所引用的情况。在这种情况下,用户在组件之间传递 Observable 以进行通信,因此最好手动取消订阅。

我不知道框架是否可以检测到任何事件订阅并在组件被销毁时自动取消订阅,这当然需要更多调查。

我希望这能澄清一些关于异步管道的问题。

关于javascript - 防止 Angular 2 中的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34461842/

相关文章:

java - 从 JVM 线程局部空间卸载 Clojure 变量

iphone - NSCFTimer 是否存在内存泄漏?

javascript - Storybook 可选 Prop force undefined

javascript - 如何使用 vuejs 和 bootstrap-vue 下载 pdf 文件

javascript - Foundation 6.2.4 响应式菜单无法像 6.0.0 那样工作(相同的代码)

javascript - AngularJS 确认密码验证

java - Spring Controller 不将 JSON 数据返回到 Angular http GET 调用

javascript - 如何并排放置 ReactJS-bootstrap 表单和 h1 标签

asp.net-mvc - angular js 和 asp.net mvc 4 示例应用程序

java - 如何在 Java Mission Control 中启用对象类型 + 分配堆栈跟踪 + GC 根路径