等待可观察对象订阅Angelar2
Await on observable subscription Angelar2
在我的Angular2应用程序中,我使用canActivate来允许访问页面。其中一部分是与服务器检查令牌是否被篡改,因此在我可以决定是否可以授予用户访问权限之前,我需要调用我的api。这意味着订阅一个可观察对象并等待答案。
我需要返回true或false,但是因为我做了一个asyns调用,我不能根据我的响应返回。我意识到我不能等待,因为它是单线程的,但我需要以某种方式阻塞,直到我从api得到答案。我的canActivate如下所示:
canActivate() {
this.guardClient.checkToken("token")
.subscribe(response => {
let responseText = response.text().replace(/"/g, '');
if ( responseText === 'Ok')
{
return true;
}
if(responseText === 'denied') {
this.router.navigate(['login']); // redirecting to login
return false;
}
});
}
谁能告诉我怎么解决这个问题? 当查看angular 2中的CanActivate界面时,我看到了以下内容:
export interface CanActivate {
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean;
}
正如你所看到的,你也可以返回一个Observable,而不仅仅是一个布尔值。这意味着你的代码可以像这样重写。
canActivate() {
return this.guardClient.checkToken("token")
.map(response => {
let responseText = response.text().replace(/"/g, '');
if ( responseText === ' Ok')
{
return true;
}
if(responseText === 'denied') {
this.router.navigate(['login']); // redirecting to login
return false;
}
});
}
这会让Angular等待可观察对象解析完毕,然后再决定该路由是否可以显示。注意,这个方法应该非常快,以避免加载缓慢。
相关文章:
- 引用对象中的通用值
- jQuery匹配JSON对象的部分文本
- 节点导出返回一个空对象
- 如何在Javascript中将JSon对象转换为数组
- 我可以在json对象中添加一个函数吗
- 使用JS将数组转换为json对象
- 全局变量和全局对象的属性之间有什么区别吗
- 比较从函数和生成的日期对象
- Javascript,访问一个主要对象模块模式中的每个对象
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 调整窗口大小时,可拖动的对象会出现在容器外部
- 如何使用javascript从主svg对象动态创建svg视图框
- 如何使用json将对象列表从java转换为javascript
- 序列化数据属性中对象的最可靠方法
- 如何访问声音管理器2创建的声音对象
- FabricJs-限制主对象内添加对象的移动区域
- Javascript(Angular)从一个对象数组到第二个数组查找值
- 值对象在某个变量发生更改后发生更改
- 如何为json对象中的段发送array[]
- 等待可观察对象订阅Angelar2