मैं एक कोणीय सेवा के भीतर प्रोफ़ाइल के उपयोगकर्ता नाम के साथ वर्तमान उपयोगकर्ता नाम की तुलना करने के लिए एक आसान तरीका स्थापित करने का प्रयास कर रहा हूं।

स्पष्ट रूप से प्रोफ़ाइल उपयोगकर्ता नाम और उपयोगकर्ता के उपयोगकर्ता नाम को उनकी तुलना करने से पहले हल करना चाहिए, तो मैं एक बूलियन अवलोकन योग्य कैसे लौटा सकता हूं ताकि मैं घटकों के भीतर इस तुलना की सदस्यता ले सकूं?

मैं यहीं पर हूं:

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
    }
)
11
Ben Racicot 21 अक्टूबर 2017, 20:46

3 जवाब

सबसे बढ़िया उत्तर

जैसा कि @ 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)
    });
}

डेमो

8
AJT82 22 अक्टूबर 2017, 14:45

मैं व्यक्तिगत रूप से forkJoin का उपयोग करने का सुझाव दूंगा, वेधशालाओं की प्रतीक्षा करने के लिए, और फ्लैटमैप को 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 अक्टूबर 2017, 20:52

यह विषय के माध्यम से प्राप्त किया जा सकता है

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 अक्टूबर 2017, 20:52