angular - Returner Observable<boolean> fra tjenestemetode etter at to abonnementer er løst
Jeg prøver å sette opp en enkel måte å sammenligne det nåværende brukernavnet med en profils brukernavn i en Angular-tjeneste.
Åpenbart må profilbrukernavnet og brukerens brukernavn løses før jeg kan sammenligne dem, så hvordan returnerer jeg en boolsk observable slik at jeg kan abonnere på denne sammenligningen i komponenter?
Dette er hvor jeg er:
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);
}
}
)
})
}
Dette ser ut til å være måten andre SO-svar forklarer å gjøre det på, men jeg får [ts] En funksjon hvis deklarerte type verken er 'void' eller 'any' må returnere en verdi.
Jeg vil gjerne abonnere på test innen komponenter.
this.authService.isProfileOwner().subscribe(
data => {
console.log(data); // should be boolean
}
)
Svar #1
Dette kan oppnås gjennom Emne
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();
}
Svar #2
Som observert fra et annet svar av @user184994, vil forkJoin ikke fungere i dette tilfellet. I stedet kan du bruke combineLatest, og deretter på en veldig lignende måte som @user184994 ellers har implementert servicekoden:
isProfileOwner(): Observable<boolean> {
return Observable.combineLatest(this.currentUser, this.profileId$)
.map(results => {
let user = results[0];
let profile = results[1];
return (user.username === profile)
});
}
