Return Observable<boolean> 来自两个订阅解析后的服务方法
Return Observable<boolean> from service method after two subscriptions resolve
我正在尝试设置一种简单的方法来将当前用户名与 Angular 服务中配置文件的用户名进行比较。
显然,个人资料用户名和用户的用户名必须先解析,然后才能比较它们,所以我如何 return 一个布尔值可观察值,以便我可以在组件内订阅此比较?
这是我所在的位置:
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
}
)
这可以通过Subject来实现
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
来等待 observables,并将 flatMap 转换为 Observable<boolean>
return Observable.forkJoin(this.currentUser, this.profileId$).flatMap(
results => {
user = results[0];
profile = results[1];
return Observable.of(profile === user.username)
}
);
正如@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
我正在尝试设置一种简单的方法来将当前用户名与 Angular 服务中配置文件的用户名进行比较。
显然,个人资料用户名和用户的用户名必须先解析,然后才能比较它们,所以我如何 return 一个布尔值可观察值,以便我可以在组件内订阅此比较?
这是我所在的位置:
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
}
)
这可以通过Subject来实现
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
来等待 observables,并将 flatMap 转换为 Observable<boolean>
return Observable.forkJoin(this.currentUser, this.profileId$).flatMap(
results => {
user = results[0];
profile = results[1];
return Observable.of(profile === user.username)
}
);
正如@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)
});
}