Angular 有角度的路线防护装置不';返回可观察时,无法按预期工作

Angular 有角度的路线防护装置不';返回可观察时,无法按预期工作,angular,rxjs,ngrx,ngrx-store,Angular,Rxjs,Ngrx,Ngrx Store,所以我有这个代码: 基本上,这个防护监听某些成功和失败ngrx操作的发生,我将其映射到它们的布尔等价物。但由于某些原因,这并没有像预期的那样起作用 在调度目标操作后,不会执行类型为rxjs运算符的,我认为在下面的代码中应该可以工作。我使用mapTo操作符将成功操作映射到布尔值true,将false映射到失败操作 书签必须存在。guard.ts 从'@angular/core'导入{Injectable}; 进口{ 激活, 激活的路由快照, 路由器状态快照, 路由器, }来自“@angular/r

所以我有这个代码:

基本上,这个防护监听某些成功和失败ngrx操作的发生,我将其映射到它们的布尔等价物。但由于某些原因,这并没有像预期的那样起作用

在调度目标操作后,不会执行类型为rxjs运算符的
,我认为在下面的代码中应该可以工作。我使用
mapTo
操作符将成功操作映射到布尔值true,将false映射到失败操作

书签必须存在。guard.ts

从'@angular/core'导入{Injectable};
进口{
激活,
激活的路由快照,
路由器状态快照,
路由器,
}来自“@angular/router”;
从“rxjs”导入{observatable,merge,race,of};
从'@ngrx/Store'导入{Store};
从'@ngrx/effects'导入{Actions,of type};
从“rxjs/operators”导入{take、mapTo、tap、switchMap};
从“@app/features/bookmarks/state/actions/bookmarks.actions”导入*作为书签操作;
@注射的({
providedIn:'根',
})
导出类BookmarkMustExistGuard实现CanActivate{
建造师(
私家店,
私有操作$:操作,
专用路由器
) {}
激活(
路由:ActivatedRouteSnapshot,
状态:RouterStateSnapshot
):可见{
const bookmark id=route.params.id;
这是我的商店(
bookmarkActions.selectOrLoadBookmark({id:bookmarkId})
);
const successAction$=此.actions$.pipe(
类型(
书签操作。选择书签以获取成功
bookmarkActions.loadBookmarkFromApiSuccess
),
mapTo(真),
采取(1)
);
const failureAction$=此.actions$.pipe(
类型(bookmarkActions.loadBookmarksFailure),
mapTo(假),
采取(1)
);
返回比赛(successAction$,failureAction$).pipe(
点击(值=>{
如果(!值){
this.router.navigateByUrl(“/未找到”);
}
}),
采取(1)
);
}
}
即使我添加了一个
take(1)
操作符,从防护装置内部的
类型的
中观察到的内容似乎也没有完成

顺便说一句,这是延迟加载的模块的路由模块

从'@angular/core'导入{NgModule};
从'@angular/router'导入{Routes,RouterModule};
从“.”导入{bookmarksmustexistguard}/guards/bookmark必须存在。guard';
从“./containers/bookmarks page/bookmarks page.component”导入{BookmarksPageComponent};
从“./containers/bookmarks当前列表容器容器/bookmarks当前列表容器.component”导入{BookmarksCurrentListContainerComponent};
从“./containers/bookmark search results container/bookmark search results container.component”导入{bookmark search results container};
从“./containers/bookmark archives container/bookmark archives container.component”导入{bookmark archives container};
从“./containers/bookmark favorites container container/bookmark favorites container.component”导入{bookmark favorites container};
从“./containers/bookmarks by tag container/bookmarks by tag container.component”导入{bookmarksbytagcontainer};
从“./containers/bookmark-reader-view-page/bookmark-reader-view-page.component”导入{bookmark-readerviewpage};
常数路由:路由=[
{
路径:“”,
组件:书签组件,
儿童:[
{
路径:“”,
组件:书签当前列表容器组件,
数据:{
鲁塞鲁特:是的,
},
},
{
路径:“搜索”,
组件:BookmarkSearchResultsContainerComponent,
},
{
路径:'存档',
组件:BookmarkArchivesContainerComponent,
},
{
路径:“收藏夹”,
组件:BookmarkFavoritesContainerComponent,
},
{
路径:'tags/:name',
组件:书签ByTagContainerComponent,
},
],
},
{
路径:“reader/:id”,
组件:BookmarkReaderServicePageComponent,
canActivate:[bookmark mustexistguard],
},
];
@NGD模块({
导入:[RouterModule.forChild(路由)],
导出:[路由模块],
})
导出类BookmarksRoutingModule{}
以下是相关的影响

selectOrLoadBookmark$=createEffect(()=>{
返回此.actions$.pipe(
类型(bookmark操作。选择或加载bookmark),
开关映射({id})=>{
返回(id)管道(
最晚从(
this.store.select(书签选择器.selectCurrentBookmark(id))
)
);
}),
switchMap([id,bookmarkInStore])=>{
log({id,bookmarkInStore});
const bookmarkFromApi$=this.bookmarksService.getBookmark(id).pipe(
映射({bookmark})=>{
返回bookmarkActions.loadBookmarkFromApiSuccess({
书签,
});
}),
catchError(错误=>
的(
bookmarkActions.loadBookmarkFromApiFailure({
错误:错误?错误?消息,
})
)
)
);
const bookmarkFromStore=bookmarkActions.selectBookmarkInStoreSuccess({
书签:bookmarkInStore,
});
//如果(!!书签存储){
//(从商店)退回书签;
// }
//从API$返回书签;
返回iif(
()=>!!书签存储,
(书签商店),
书签来自API$
);
})
);
});

经过数小时的调试,我终于找到了一些有效的方法

问题: 因此,基本上,我以前的实现可能存在的问题是