subscribe 方法中的箭头函数被立即调用
The arrow function inside the subscribe method is being called inmediatly
我有一个 angular 对话框,它使用 ngrx
调用 API。
registerEvents
只是对一个数组添加两个订阅,只在构造函数中调用
但由于某种原因,两个订阅的粗箭头内的代码在对话框打开后立即被调用,我希望只有一条“新数据”消息,而不是两条。
几乎就像 registerEvents
正在执行箭头函数或自动调度操作
constructor(@Inject(MAT_DIALOG_DATA) public data: any,
private dialogRef: MatDialogRef<ScheduledAppointmentsDialogComponent>,
private orderStore$: Store<OrdersState.State>)
{
this.registerEvents();
}
registerEvents() {
this.subscriptions.push(this.apptsForOrder$.subscribe((apptsForOrder: any[]) => {
console.log("new data");
this.apptsForOrder = apptsForOrder;
}));
this.subscriptions.push(this.updateAttachedAppointment$.subscribe((attachAppointment: boolean) => {
console.log({ attachAppointment: attachAppointment });
this.toogleLinkStatus();
}, (err) => { console.log(err) }));
}
ngOnInit(): void {
// other code
this.loadApptsForOrder();
// other code
}
loadApptsForOrder() {
this.orderStore$.dispatch(OrdersActions.loadApptsForOrder({ orderId: this.orderId }));
}
loadApptsForOrder
仅在 onInit
内部调用,但有两条“新数据”消息
我试过从 mergeMap 更改为 switchMap 但没有任何效果
attachAppointment$ = createEffect(() => this.actions$.pipe(
ofType(actions.attachAppointment),
mergeMap(args => this.orderService.attachAppointment(args.attachAppointmentRequest)
.pipe(
map(response => actions.attachAppointmentComplete({ attachAppointmentResponse: response.statusCode })),
catchError(() => of(actions.attachAppointmentFailure({ error: 'fail' })))
)
)
));
这可能是我实现 service/store 的方式的错误吗?以我订阅的方式或其他方式?
apptsForOrder$
和 orderStore$
是 observables<T>
private apptsForOrder$ = this.orderStore$.select(OrdersSelectors.getApptsForOrder);
private updateAttachedAppointment$ = this.orderStore$.select(OrdersSelectors.updateAttachedAppointment);
apptsForOrder$ 是 BehaviourSubject 吗?在 Behaviour Subjects 中,回调在订阅时以及当 subject 有新值时执行。在 Subjects 中,只有当 subject 有新值时才会执行回调。
看到这个:
NgRx 选择器将在订阅完成后直接开始发送值。第一个值发出是存储当前值。要在您的组件上禁用此行为,您可以在订阅前使用 RxJs 运算符 skip(1)
。
我有一个 angular 对话框,它使用 ngrx
调用 API。
registerEvents
只是对一个数组添加两个订阅,只在构造函数中调用
但由于某种原因,两个订阅的粗箭头内的代码在对话框打开后立即被调用,我希望只有一条“新数据”消息,而不是两条。
几乎就像 registerEvents
正在执行箭头函数或自动调度操作
constructor(@Inject(MAT_DIALOG_DATA) public data: any,
private dialogRef: MatDialogRef<ScheduledAppointmentsDialogComponent>,
private orderStore$: Store<OrdersState.State>)
{
this.registerEvents();
}
registerEvents() {
this.subscriptions.push(this.apptsForOrder$.subscribe((apptsForOrder: any[]) => {
console.log("new data");
this.apptsForOrder = apptsForOrder;
}));
this.subscriptions.push(this.updateAttachedAppointment$.subscribe((attachAppointment: boolean) => {
console.log({ attachAppointment: attachAppointment });
this.toogleLinkStatus();
}, (err) => { console.log(err) }));
}
ngOnInit(): void {
// other code
this.loadApptsForOrder();
// other code
}
loadApptsForOrder() {
this.orderStore$.dispatch(OrdersActions.loadApptsForOrder({ orderId: this.orderId }));
}
loadApptsForOrder
仅在 onInit
内部调用,但有两条“新数据”消息
我试过从 mergeMap 更改为 switchMap 但没有任何效果
attachAppointment$ = createEffect(() => this.actions$.pipe(
ofType(actions.attachAppointment),
mergeMap(args => this.orderService.attachAppointment(args.attachAppointmentRequest)
.pipe(
map(response => actions.attachAppointmentComplete({ attachAppointmentResponse: response.statusCode })),
catchError(() => of(actions.attachAppointmentFailure({ error: 'fail' })))
)
)
));
这可能是我实现 service/store 的方式的错误吗?以我订阅的方式或其他方式?
apptsForOrder$
和 orderStore$
是 observables<T>
private apptsForOrder$ = this.orderStore$.select(OrdersSelectors.getApptsForOrder);
private updateAttachedAppointment$ = this.orderStore$.select(OrdersSelectors.updateAttachedAppointment);
apptsForOrder$ 是 BehaviourSubject 吗?在 Behaviour Subjects 中,回调在订阅时以及当 subject 有新值时执行。在 Subjects 中,只有当 subject 有新值时才会执行回调。
看到这个:
NgRx 选择器将在订阅完成后直接开始发送值。第一个值发出是存储当前值。要在您的组件上禁用此行为,您可以在订阅前使用 RxJs 运算符 skip(1)
。