Angular中使用take(1)操作符时是否需要手动取消Observable订阅
原代码失效原因
你初始写法的问题在于直接把toGetAllAplicativos()返回的Observable对象赋值给了MatTableDataSource,而Angular Material表格的数据源需要接收实际的数组数据,必须订阅Observable拿到接口返回的结果后再初始化数据源,你调整后的写法逻辑是正确的。
take(1)场景下无需手动取消订阅
答案是不需要,原因有两点:
take(1)操作符会在流发射第一个值之后自动终止整个流,同时解除对应的订阅关系,不会残留无效引用导致内存泄漏。- 你调用的是Angular
HttpClient的get方法,本身所有HttpClient返回的请求类Observable,无论是否添加take(1),在请求结束(成功响应、报错、超时)后都会自动结束流,不需要手动处理订阅销毁。
特殊场景说明
如果存在「请求未返回时用户就离开当前组件」的情况,此时未完成的请求最多会等到响应/超时后执行一次空回调,不会造成内存问题。如果你需要在组件销毁时直接中断未完成的请求,可以手动保存订阅实例,在ngOnDestroy生命周期钩子中调用unsubscribe即可。
内容的提问来源于stack exchange,提问作者Desenv Junior
相关产品推荐
相关产品推荐

