Angularサービス内の現在のユーザー名とプロファイルのユーザー名を比較する簡単な方法を設定しようとしています。
明らかに、プロファイルのユーザー名とユーザーのユーザー名は、比較する前に解決する必要があります。したがって、コンポーネント内でこの比較にサブスクライブできるように、ブール値のobservableを返すにはどうすればよいですか?
これは私がいる場所です:
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);
}
}
)
})
}
これは他のSO回答がそれを行うために説明する方法であるように思えますが、私は[ts] A function whose declared type is neither 'void' nor 'any' must return a value.
コンポーネント内のテストにサブスクライブしたいと思います。
this.authService.isProfileOwner().subscribe(
data => {
console.log(data); // should be boolean
}
)
@ user184994による他の回答からわかるように、この場合、forkJoin
は機能しません。代わりにcombineLatest
を使用でき、@ user184994がサービスコードを実装した場合と同様に非常に似ています。
isProfileOwner(): Observable<boolean> {
return Observable.combineLatest(this.currentUser, this.profileId$)
.map(results => {
let user = results[0];
let profile = results[1];
return (user.username === profile)
});
}
これは、サブジェクトを通じて達成できます
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();
}
個人的には、forkJoin
を使用してオブザーバブルを待機し、flatMapをObservable<boolean>
に変換することをお勧めします
return Observable.forkJoin(this.currentUser, this.profileId$).flatMap(
results => {
user = results[0];
profile = results[1];
return Observable.of(profile === user.username)
}
);