NgRx @Effect 与 createEffect

问题描述

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}))
  );

}

解决方法

@ngrx/效果 类型安全的 createEffect 作为 @Effect() 装饰器的替代,NgRx 8 提供了 createEffect 函数。使用 createEffect 的优点是它是类型安全的,如果效果没有返回 Observable<Action> 它将给出编译错误。选项 { dispatch: false } 仍然存在于不发送新 Actions 的效果中,添加此选项还消除了效果需要返回 Observable<Action> 的限制。

默认从NgRx 8开始,出现这种情况时自动重新订阅效果。这为遗漏不愉快路径的地方增加了一个安全网。 可以通过在效果级别将 resubscribeOnError 设置为 false 来关闭此功能。 例子:

login$ = createEffect(() => .....),{ resubscribeOnError: false });