问题描述
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 });