[英]@ngrx/store pre-load guard catch error
我正在使用@ ngrx / store在Angular Guard上进行检查,以检查状态是否已加载,并且遇到一个问题,即如果我使用过滤器, canActivate
方法将永远不会返回。
这是GetCompanies操作的示例效果:
return this.companiesService.getCompanies()
.pipe(
map(companies => new companiesActions.GetCompaniesSuccess(companies)),
catchError(error => Observable.of(new companiesActions.GetCompaniesFail(error)))
)
如果出现错误,我将调度GetCompaniesFail操作,并将用户重定向到/login
页面。 很好,有趣的部分是守卫。
@Injectable()
export class CompaniesGuard implements CanActivate {
constructor(
private store: Store<AppState>,
private router: Router
) {}
canActivate(): Observable<boolean> {
return this.checkStore()
.pipe(
switchMap(() => Observable.of(true)),
catchError(() => Observable.of(false))
);
}
checkStore(): Observable<boolean> {
return this.store.select(getCompaniesLoaded)
.pipe(
tap(loaded => {
if (!loaded) {
this.store.dispatch(new companiesActions.GetCompanies());
}
}),
filter(loaded => loaded),
take(1)
);
}
}
如果出现错误并且加载的结果不是false,则canActivate
将不会返回任何内容,因为checkStore
不会执行任何操作。
如果我更改filter
以map
它可以工作,但是即使数据将成功加载,它也仅采用第一个为false
值。
我想念什么? 我该如何处理HTTP错误? 有没有办法等待某些状态或在checkStore
抛出错误?
预先感谢!
如果将职责分开一些,这似乎更容易处理。
无论如何,您都应该运行checkStore
而不直接依赖于它的结果。 相反,让商店通知您成功或失败并返回结果。
请注意,ngrx和redux鼓励单向数据流来简化应用程序逻辑。
该店物业getCompaniesLoadedStatus
在初始化为初始 ,并设置为成功或失败的内部companiesActions.GetCompaniesSuccess
或companiesActions.GetCompaniesFail
。
重试在服务中处理(更接近于提取)。
canActivate(): Observable<boolean> {
this.checkStore();
return this.store.select(getCompaniesLoadedStatus).pipe(
filter(status => status !== 'initial'),
map(status => status === 'success' ? true : false )
);
}
checkStore(): void {
this.store.select(getCompaniesLoadedStatus).pipe(
take(1) // so that unsubscribe is not needed
).subscribe(status =>
if (status === 'initial') {
this.store.dispatch(new companiesActions.GetCompanies());
}
);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.