状态改变时订阅陷入无限循环
Subscribe stuck in endless loop when state changed
有人知道如何解决向商店订阅内的商店发送操作时的无限循环吗?为了避免循环,我不得不在商店内添加一个条件,但我想知道是否有更优雅的方式让它工作。
无限循环代码:
ngOnInit(): void {
this.store.select('admin').subscribe(
(adminState: AdminState) => {
const relations = 'dockSubscriptions,dockSubscription.dock,dock.tiles';
const uri = `users/${adminState.currentUserId}?relations=${relations}`;
this.apiService.get(uri).subscribe(
(user: User) => {
this.store.dispatch(new AppActions.SetCurrentUser(user));
this.router.navigate(['/']);
this.currentUserId = adminState.currentUserId;
},
(error) => {
this.auth.logout();
}
);
}
);
}
没有循环的代码:
ngOnInit(): void {
this.store.select('admin').subscribe(
(adminState: AdminState) => {
if (adminState.currentUserId && adminState.currentUserId !== this.currentUserId) {
const relations = 'dockSubscriptions,dockSubscription.dock,dock.tiles';
const uri = `users/${adminState.currentUserId}?relations=${relations}`;
this.apiService.get(uri).subscribe(
(user: User) => {
this.store.dispatch(new AppActions.SetCurrentUser(user));
this.router.navigate(['/']);
this.currentUserId = adminState.currentUserId;
},
(error) => {
this.auth.logout();
}
);
}
}
);
}
有更好的解决方案吗?
使用 rxjs 中的 filter
运算符。
this.store.select('admin').pipe(filter(state => {
return state.currentUserId && state.currentUserId !== this.currentUserId
})).subscribe(...)
或者,您似乎并不真正需要对用户状态的公开订阅,因此您可以直接通过管道传输 take(1)
。
有人知道如何解决向商店订阅内的商店发送操作时的无限循环吗?为了避免循环,我不得不在商店内添加一个条件,但我想知道是否有更优雅的方式让它工作。
无限循环代码:
ngOnInit(): void {
this.store.select('admin').subscribe(
(adminState: AdminState) => {
const relations = 'dockSubscriptions,dockSubscription.dock,dock.tiles';
const uri = `users/${adminState.currentUserId}?relations=${relations}`;
this.apiService.get(uri).subscribe(
(user: User) => {
this.store.dispatch(new AppActions.SetCurrentUser(user));
this.router.navigate(['/']);
this.currentUserId = adminState.currentUserId;
},
(error) => {
this.auth.logout();
}
);
}
);
}
没有循环的代码:
ngOnInit(): void {
this.store.select('admin').subscribe(
(adminState: AdminState) => {
if (adminState.currentUserId && adminState.currentUserId !== this.currentUserId) {
const relations = 'dockSubscriptions,dockSubscription.dock,dock.tiles';
const uri = `users/${adminState.currentUserId}?relations=${relations}`;
this.apiService.get(uri).subscribe(
(user: User) => {
this.store.dispatch(new AppActions.SetCurrentUser(user));
this.router.navigate(['/']);
this.currentUserId = adminState.currentUserId;
},
(error) => {
this.auth.logout();
}
);
}
}
);
}
有更好的解决方案吗?
使用 rxjs 中的 filter
运算符。
this.store.select('admin').pipe(filter(state => {
return state.currentUserId && state.currentUserId !== this.currentUserId
})).subscribe(...)
或者,您似乎并不真正需要对用户状态的公开订阅,因此您可以直接通过管道传输 take(1)
。