如何检查RxJS Observable是否包含Angular2中的字符串?
我对Angular2和Observable不熟悉,我想检查类型为如何检查RxJS Observable是否包含Angular2中的字符串?,angular,typescript,rxjs,rxjs5,Angular,Typescript,Rxjs,Rxjs5,我对Angular2和Observable不熟悉,我想检查类型为Observable的ObservablegetRoles是否包含字符串 public hasRole(name: string): boolean { // getRoles is of type Observable<string[]> let getRoles = this.tokenService.getTokenInformation().map(element => element.ro
Observable
的ObservablegetRoles
是否包含字符串
public hasRole(name: string): boolean {
// getRoles is of type Observable<string[]>
let getRoles = this.tokenService.getTokenInformation().map(element => element.roles);
if (/* check if name is inside of getRoles */) {
return true;
}
return false;
}
public角色(名称:字符串):布尔值{
//getRoles属于Observable类型
让getRoles=this.tokenService.getTokenInformation().map(element=>element.roles);
if(/*检查名称是否在getRoles*/内){
返回true;
}
返回false;
}
可观察对象是异步的,因此您不能使用让getRoles=…映射(…)
。该方法不是在数组上执行,而是在始终异步的可观察对象上执行
所以正确的方法是(我没有测试这段代码):
当源代码完成时(当我们迭代所有角色时),未找到匹配元素时,运算符将发出错误
然后使用如下方法:
hasRole('my-role').subscribe(
role => console.log("has role"),
error => console.log("doesn't have role"),
)
编辑:
这将所有内容仅转换为true
或false
值。请参阅文档了解first()
运算符这些参数是什么。然后我使用map()
强制将所有内容转换为布尔值
public hasRole(name: string): Observable {
return this.tokenService.getTokenInformation()
.map(element => element.roles)
.first(roles => roles.indexOf(name) !== -1, undefined, false)
.map(val => !!val);
}
请参阅live simplified demo:我收到一个错误,它应该是hasRole(…):可观察的。但是,有可能以某种方式获得布尔返回类型吗?因为我想知道可观察对象是否包含我的字符串?@Devid当调用
console.log(“has role”)
时,角色在角色中。当调用console.log(“没有角色”)
时,它没有被调用。如果您真的只想接收true
offalse
请查看我的更新。@Martin OP希望从他的方法返回bool。。只需更改方法,使其返回一个bool
,就是这样。。(在添加了您编辑的评论后,它已经涵盖了这一点。酷!)+1@Martin谢谢你的帮助。虽然现在有点棘手。我会测试一下,然后接受你的答案。另外,你知道一个很好的教程,在那里我可以通过承诺和观察来获得温暖吗?@Devid我个人推荐他们的github回购协议中的官方文件。特别是
public hasRole(name: string): Observable {
return this.tokenService.getTokenInformation()
.map(element => element.roles)
.first(roles => roles.indexOf(name) !== -1, undefined, false)
.map(val => !!val);
}