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



我是Angular2和Observable的新手,我想检查Observable<string[]>类型的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;
}

观察对象是异步的,所以你不能使用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

最新更新