web-dev-qa-db-ja.com

2つのサブスクリプションが解決した後、サービスメソッドからObservable <boolean>を返します

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
    }
)
9
Ben Racicot

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

[〜#〜] demo [〜#〜]

5
AJT82

これは、サブジェクトを通じて達成できます

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

個人的には、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)
    }
);
3
user184994