/ / Comment vérifier si un observable RxJS contient une chaîne dans Angular2? - angulaire, dactylographié, rxjs, rxjs5

Comment vérifier si un observable RxJS contient une chaîne dans Angular2? - angulaire, dactylographié, rxjs, rxjs5

Je suis nouveau sur Angular2 et Observable, je veux vérifier si un observable getRoles qui est de type Observable<string[]> contient une chaîne.

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

Réponses:

2 pour la réponse № 1

Les observables sont asynchrones, vous ne pouvez donc pas utiliser let getRoles = ...map(...). le map() La méthode n'est pas exécutée sur un tableau, mais sur un observable toujours asynchrone.

Donc, la bonne façon de le faire pourrait être (je n’ai pas testé ce code):

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

Opérateur first() émet une erreur lorsqu'aucun élément correspondant n'a été trouvé lorsque la source est terminée (lorsque nous avons itéré tous les rôles).

Ensuite, utilisez cette méthode comme:

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

Modifier:

Ceci convertit tout en seulement true ou false valeurs. Voir doc pour first() opérateur quels sont ces arguments. Puis j'ai utilisé map() forcer tout convertir en booléen.

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

Voir la démo simplifiée en direct: http://plnkr.co/edit/MtYfGLgqgHACPswFTVJ5