在我的路线防护中,我试图将需要按特定顺序完成的多个请求链接在一起,以确定是否允许用户查看路线。首先,我想获取userRegions,一旦完成,我就需要获取getReadWritePermissions,一旦完成,我将返回一个true或false的observable,这取决于是否允许该用户访问该路由。 getUserRegions和getWritePermissions都返回一个数组的Observable。
canActivate(): Observable<boolean> {
return this.securityService
.getUserRegions(this.authService.userName)
.pipe(
mergeMap((userRegions: Region[]) => {
this.regionService.setRegionList(userRegions);
return this.permissionsService.getReadWritePermissions(
this.authService.userName,
userRegions.map(r => r.regionId),
undefined
);
}),
catchError((regionsErr: any) => { // HERE I WANT TO CATCH ANY ERROR FROM getUserRegions()
debugger
return throwError(regionsErr);
})
)
.pipe(
map((regionPermissions: RegionPermission[]) => {
this.regionService.setRegionPermissionList(regionPermissions);
return regionPermissions.some(rp => rp.readWriteAccess.hasReadAccess || rp.readWriteAccess.hasWriteAccess);
}),
catchError((permissionsErr: any) => { // HERE I WANT TO CATCH ANY ERROR FROM getReadWritePermissions()
debugger
return throwError(permissionsErr);
})
);
}
发生的事情是,我永远无法捕获来自getReadWritePermissions()调用的错误。仅当第一个catchError中引发错误时,才会命中第二个catchError断点。我认为这很有意义,但是我不知道如何解决从getReadWritePermissions()中捕获任何错误的问题。路由防护器可以按预期工作,所以这不是问题。只是getReadWritePermissions()方法调用了API,并且如果api响应为404、401等(例如错误),我希望能够捕获到这一点。
这里到底发生了什么?内在可观察的是哪一个,外在可观察的是哪一个?为什么我不能从mergeMap捕获返回的observable的错误,我该怎么做呢?