【问题标题】:How to check if a RxJS Observable contains a string in Angular2?如何检查 RxJS Observable 是否包含 Angular2 中的字符串?
【发布时间】:2017-03-06 07:12:12
【问题描述】:

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

【问题讨论】:

    标签: angular typescript rxjs rxjs5


    【解决方案1】:

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

    【讨论】:

    • 我得到一个错误,它应该是 hasRole(...):Observable。但是有可能以某种方式获得布尔返回类型吗?因为我想知道 Observable 是否包含我的字符串?
    • @Devid 当console.log("has role") 被调用时,该角色在roles 之间。当console.log("doesn't have role") 被调用时,它不是。如果您真的只想收到false 中的true,请查看我的更新。
    • @Martin OP 期望从他的方法中返回一个布尔值。只需更改方法,使其返回 bool ,它涵盖了那个东西。酷!)+1
    • @Martin 感谢您的帮助。虽然现在有点棘手。我将对其进行测试,然后接受您的回答。附言。你知道一个很好的教程,我可以用 promise 和 observable 获得温暖吗?
    猜你喜欢
    • 2018-11-12
    • 2017-09-23
    • 2021-11-10
    • 1970-01-01
    • 2012-02-11
    • 2016-03-25
    • 1970-01-01
    • 2020-12-12
    相关资源
    最近更新 更多