如何检查RxJS Observable是否包含Angular2中的字符串?

如何检查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

我对Angular2和Observable不熟悉,我想检查类型为
Observable
的Observable
getRoles
是否包含字符串

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
of
false
请查看我的更新。@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);
}