Estoy tratando de configurar una forma simple de comparar el nombre de usuario actual con el nombre de usuario de un perfil dentro de un servicio Angular.

Obviamente, el nombre de usuario del perfil y el nombre de usuario del usuario deben resolverse antes de que pueda compararlos, entonces, ¿cómo devuelvo un observable booleano para poder suscribirme a esta comparación dentro de los componentes?

Aquí es donde estoy:

public profileId = new Subject<string>; // Observable string source updated from a profile.component (when the URL displays the profile's username)
public profileId$ = this.profileId.asObservable();
public currentUser = this.principal.asObservable().distinctUntilChanged();

public isProfileOwner(): Observable<boolean> { // A function whose declared type is neither 'void' nor 'any' must return a value.
    this.currentUser.subscribe(user => {
            this.profileId$.subscribe(
                profile => {
                    console.log(profile + ' ' + user.username); // match!
                    if (profile === user.username) {
                        return Observable.of(true);
                    } else {
                        return Observable.of(false);
                    }
                }
            )
        })
}

Esta parece ser la forma en que otras respuestas SO explican hacerlo, pero obtengo [ts] A function whose declared type is neither 'void' nor 'any' must return a value.

Me gustaría suscribirme para probar dentro de los componentes.

this.authService.isProfileOwner().subscribe(
    data => {
        console.log(data); // should be boolean
    }
)
11
Ben Racicot 21 oct. 2017 a las 20:46

3 respuestas

La mejor respuesta

Como se observó en otra respuesta de @ user184994, forkJoin no funcionará en este caso. En su lugar, puede usar combineLatest, y luego de manera muy similar, como @ user184994, ha implementado el código de servicio:

isProfileOwner(): Observable<boolean> {
  return Observable.combineLatest(this.currentUser, this.profileId$)
    .map(results => {
       let user = results[0];
       let profile = results[1];
       return (user.username === profile)
    });
}

Demo

7
AJT82 22 oct. 2017 a las 11:45

Esto se puede lograr a través del Asunto

import { Subject } from 'rxjs';

public isProfileOwner(): Observable<boolean> {
        var subject = new Subject<boolean>();

        this.currentUser.subscribe(user => {
                this.profileId$.subscribe(
                    profile => {
                        console.log(profile + ' ' + user.username); // match!
                        if (profile === user.username) {
                            subject.next(true);
                        } else {
                            subject.next(false);

                        }
                    }
                )
            })
            return subject.asObservable();
    }
10
Rajani Kanth 21 oct. 2017 a las 17:52

Yo personalmente sugeriría usar forkJoin para esperar a los observables y flatMap para convertirlo en Observable<boolean>

return Observable.forkJoin(this.currentUser, this.profileId$).flatMap(
    results => {
        user = results[0];
        profile = results[1];
        return Observable.of(profile === user.username)
    }
);
5
user184994 21 oct. 2017 a las 17:52