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)中调度多个动作?

@ngrx Effect 没有第二次运行

Angular 5 ngrx Effect 没有导出成员'ofType'

Cordova + ngrx/effect fire and forget long running 方法冻结 UI

ngrx effect 多次调用observer,但只调度了一个action

如何处理来自 ngrx effect 的 catch 块的错误并将其发送到组件中?