3 回答

TA貢獻1719條經(jīng)驗 獲得超6個贊
通常,在從視圖/dom 卸載某些組件后,不必銷毀/禁用您的服務。將它們視為一層代碼來執(zhí)行一些數(shù)據(jù)轉(zhuǎn)換或獲取。
問:為什么每個人都使用takeUntil(this.destroyed$)
或this.subscription.unsubscribe()
?
A:Observable
只要有至少一個訂閱者就可以生存。因此,如果您有一些長期存在的 observables 在某些操作后沒有立即完成,您將有內(nèi)存泄漏(Angular 可以多次創(chuàng)建/初始化每個組件)。說到Angular
的http
,所有的get
,post
,put
和delete
后端調(diào)用完成后,呼叫結(jié)束。這意味著你不必添加unsubscribe
在onDestroy
鉤或使用takeUntil
。
如果您已建立Websocket
連接并正在收聽某些消息,則您的流將變得持久,并且訂閱此消息的每個組件都應在onDestroy
循環(huán)期間取消訂閱。如果你不這樣做,Angular 可以多次初始化你的組件(這通常發(fā)生在*ngIf=""
語句中)并且多個訂閱被創(chuàng)建但永遠不會被銷毀。這會導致內(nèi)存泄漏。
不幸的是,這是大多數(shù) Angular 項目的常見問題,可以通過手動unsubscribe
/takeUntil
或使用在組件銷毀后async
自動執(zhí)行的管道來解決unsubscribe
。

TA貢獻1820條經(jīng)驗 獲得超10個贊
一種選擇是在模板中使用異步管道來管理訂閱
data$ = this.service.getSomeData();
并在您的模板中
<ng-container *ngIf="data$ | async as data">
{{ data | json }}
You can use the template variable data here that magically updates every time data$
emits and no need to unsubscribe as the async pipe manages the subscription for you
</ng-container>
如果 observable 發(fā)出的數(shù)據(jù)不是模板所需的形狀,則使用 map 函數(shù)
data$ = this.service.getSomeData().pipe(map(data => functionThatTransformsData(data)));
您可以在此處閱讀我在狀態(tài)管理庫中使用的模式https://medium.com/@adrianbrand/angular-state-management-with-rxcache-468a865fc3fb

TA貢獻1789條經(jīng)驗 獲得超10個贊
我很高興你這么問,我遇到了這個Angular AutoUnsubscribe(我引用這個是因為我發(fā)現(xiàn)實現(xiàn)它的邏輯真的很漂亮。)
它相對易于使用,并且適用于所有可聲明對象(顯然是管道、指令和組件。)
現(xiàn)在省略訂閱和取消訂閱部分(我不會建議),它非常簡單,直接。
早些時候你有類似的東西
getSomeData(): Observable<any> {
// for eg
return this.http.get();
}
您必須將其更改為:
getSomeData(callback, onDestroy$): Observable<any> {
this.http.get(...).pipe(takeUntil(onDestroy$)).subscribe(val => callback(val));
}
然后我們將能夠擁有我們最終想要的東西。干杯。
添加回答
舉報