NgRx 是一个基于 RxJS 的状态管理库,用于 Angular 应用程序。它通过使用 Redux 模式来管理应用程序的状态。NgRx 中的 Effects 用于处理副作用操作,例如 API 调用、异步任务等。
在 NgRx 中,Effects 通常返回一个 Observable,这意味着它们会持续运行直到被取消订阅。如果不取消订阅,可能会导致内存泄漏或意外的行为,特别是在组件销毁时。
takeUntil
操作符在组件中,可以使用 takeUntil
操作符来监听组件的销毁事件,并在此时取消订阅 Effects。
import { Component, OnInit, OnDestroy } from '@angular/core';
import { Store } from '@ngrx/store';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { MyEffectService } from './my-effect.service';
@Component({
selector: 'app-my-component',
templateUrl: './my-component.component.html',
styleUrls: ['./my.component.css']
})
export class MyComponent implements OnInit, OnDestroy {
private destroy$ = new Subject<void>();
constructor(private store: Store, private myEffectService: MyEffectService) {}
ngOnInit() {
this.myEffectService.myEffect$.pipe(takeUntil(this.destroy$)).subscribe();
}
ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
}
}
take(1)
操作符如果 Effects 只需要运行一次,可以使用 take(1)
操作符来确保它在完成一次后自动取消订阅。
import { Injectable } from '@angular/core';
import { Actions, createEffect, ofType } from '@ngrx/effects';
import { of } from 'rxjs';
import { catchError, map, mergeMap, take } from 'rxjs/operators';
import { MyService } from './my.service';
import { myAction, myActionSuccess, myActionFailure } from './my.actions';
@Injectable()
export class MyEffects {
myEffect$ = createEffect(() =>
this.actions$.pipe(
ofType(myAction),
mergeMap(() =>
this.myService.doSomething().pipe(
take(1), // 只取一次
map(result => myActionSuccess({ result })),
catchError(error => of(myActionFailure({ error })))
)
)
)
);
constructor(
private actions$: Actions,
private myService: MyService
) {}
}
通过以上方法,可以有效地取消订阅 NgRx 中的 Effects,避免内存泄漏和其他潜在问题。
领取专属 10元无门槛券
手把手带您无忧上云