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

时间:2016-10-24 13:21:38

标签: angular typescript rxjs rxjs5

我是Angular2和Observable的新手,我想检查getRoles类型的Observable Observable<string[]>是否包含字符串。

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;
}

1 个答案:

答案 0 :(得分:2)

Observable是异步的,因此您无法使用let getRoles = ...map(...)map()方法不是在数组上执行,而是在一个始终异步的Observable上执行。

这样做的正确方法可能是(我没有测试过这段代码):

public hasRole(name: string): Observable {
    return this.tokenService.getTokenInformation()
        .map(element => element.roles)
        .first(roles => roles.indexOf(name) !== -1);
}

当源完成时(当我们迭代所有角色时)没有找到匹配元素时,运算符first()会发出错误。

然后使用以下方法:

hasRole('my-role').subscribe(
    role => console.log("has role"),
    error => console.log("doesn't have role"),
)

编辑:

这会将所有内容转换为truefalse个值。请参阅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);
}

查看实时简化演示:http://plnkr.co/edit/MtYfGLgqgHACPswFTVJ5