两个订阅解析

时间:2017-10-21 17:46:03

标签: angular typescript rxjs rxjs5

我正在尝试设置一种简单的方法来将当前用户名与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
    }
)

3 个答案:

答案 0 :(得分:7)

这可以通过主题

来实现
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();
    }

答案 1 :(得分:4)

从@ user184994的其他回答中注意到,combineLatest在这种情况下无法工作。相反,您可以使用isProfileOwner(): Observable<boolean> { return Observable.combineLatest(this.currentUser, this.profileId$) .map(results => { let user = results[0]; let profile = results[1]; return (user.username === profile) }); } ,然后非常类似于@ user184994已经实现了服务代码:

column names:   name1URL | name1PRICE | name2URL | name2PRICE | name3URL | name3PRICE ....
example row:    link1.co       1        link2.co        11      link3.co        4

DEMO

答案 2 :(得分:3)

我个人建议使用forkJoin来等待observable,并使用flatMap转换为Observable<boolean>

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