web-dev-qa-db-fra.com

Retourne <boolean> observable à partir de la méthode de service après la résolution de deux abonnements

J'essaie de configurer un moyen simple de comparer le nom d'utilisateur actuel avec le nom d'utilisateur d'un profil dans un service Angular.

Évidemment, le nom d'utilisateur du profil et le nom d'utilisateur de l'utilisateur doivent résoudre avant de pouvoir les comparer, alors comment renvoyer un booléen observable pour pouvoir m'abonner à cette comparaison dans les composants?

C'est là que j'en suis:

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

Cela semble être la façon dont les autres SO réponses expliquent le faire mais je reçois [ts] A function whose declared type is neither 'void' nor 'any' must return a value.

Je souhaite m'abonner pour tester dans les composants.

this.authService.isProfileOwner().subscribe(
    data => {
        console.log(data); // should be boolean
    }
)
9
Ben Racicot

Comme indiqué dans une autre réponse de @ user184994, forkJoin ne fonctionnera pas dans ce cas. Au lieu de cela, vous pouvez utiliser combineLatest, puis très similaire à @ user184994, sinon, vous avez implémenté le code de service:

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

[~ # ~] démo [~ # ~]

5
AJT82

Ceci peut être réalisé à travers le sujet

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();
    }
8
Rajani Kanth

Je suggère personnellement d'utiliser forkJoin, pour attendre les observables, et flatMap pour convertir en Observable<boolean>

return Observable.forkJoin(this.currentUser, this.profileId$).flatMap(
    results => {
        user = results[0];
        profile = results[1];
        return Observable.of(profile === user.username)
    }
);
3
user184994