NgRx @Effect 与 createEffect
Posted
技术标签:
【中文标题】NgRx @Effect 与 createEffect【英文标题】:NgRx @Effect vs createEffect 【发布时间】:2021-07-21 10:44:12 【问题描述】:ngrx 中的createEffect
与@Effect
注释有什么区别?
@Injectable()
export class ContactsEffects
constructor(
private actions$: Actions,
private contactsService: ContactsService,
private contactsSocket: ContactsSocketService
)
destroy$ = createEffect( () => this.actions$.pipe(
ofType(remove),
pluck('id'),
switchMap( id => this.contactsService.destroy(id).pipe(
pluck('id'),
map(id => removeSuccess(id))
))
));
@Effect()
liveCreate$ = this.contactsSocket.liveCreated$.pipe(
map(contact => createSuccess(contact))
);
【问题讨论】:
【参考方案1】:@ngrx/效果
createEffect 用于类型安全
作为@Effect()
装饰器的替代品,NgRx 8 提供了createEffect
函数。使用createEffect
的优点是它是类型安全的,如果效果不返回Observable<Action>
它将给出编译错误。 dispatch: false
选项对于不调度新动作的效果仍然存在,添加此选项也消除了效果需要返回 Observable<Action>
的限制。
默认从 NgRx 8 开始,发生这种情况时会自动重新订阅效果。这为错过不愉快路径的地方增加了一个安全网。
可以通过在效果级别将 resubscribeOnError
设置为 false 来关闭此功能。
示例:
login$ = createEffect(() => .....), resubscribeOnError: false );
【讨论】:
以上是关于NgRx @Effect 与 createEffect的主要内容,如果未能解决你的问题,请参考以下文章
如何在ngrx/effect(redux-observable)中调度多个动作?
Angular 5 ngrx Effect 没有导出成员'ofType'
Cordova + ngrx/effect fire and forget long running 方法冻结 UI