Angular RxJS-返回具有值的主题

Angular RxJS-返回具有值的主题,angular,rxjs,rxjs5,Angular,Rxjs,Rxjs5,我已经创建了一个身份验证服务,组件可以订阅权限更改(登录/注销/角色更改等)。 在isAuthenticated函数中,我返回一个主题。 问题是我想用一个值(比如Observable.of)返回主题。现在,我使用的是setTimeout @Injectable() 导出类身份验证服务{ 构造函数(私有凭据:CredantialsStorage Service, 专用oauthService:OAuth2Service, 私有secureHttp:SecureHttpService){} pri

我已经创建了一个身份验证服务,组件可以订阅权限更改(登录/注销/角色更改等)。 在isAuthenticated函数中,我返回一个主题。 问题是我想用一个值(比如Observable.of)返回主题。现在,我使用的是setTimeout

@Injectable()
导出类身份验证服务{
构造函数(私有凭据:CredantialsStorage Service,
专用oauthService:OAuth2Service,
私有secureHttp:SecureHttpService){}
private isAuthenticatedSubject:Subject=新Subject();
登录(电子邮件:字符串,密码:字符串,记住?:布尔):可观察{
返回此.oauthService.login(电子邮件、密码)
.flatMap(()=>this.getAndStoreUserCredantials())
.map((userCredantials:any)=>{
this.isAuthenticatedSubject.next(true);
返回true;
})
}
注销():可观察到{
返回此.secureHttp.post('/logout',null)
.最后(()=>{
这是.credentials.clear();
这个.oauthService.clear();
this.isAuthenticatedSubject.next(false);
})
.map(()=>null);
}
isAuthenticated():可观察{
setTimeout(()=>{//Hack-找到一种方法来更改此设置
this.isAuthenticatedSubject.next(this.oauthService.isAuthenticated());
})
返回此.isAuthenticatedSubject;
}
私有getAndStoreUserCredantials(){
返回此.secureHttp.get(“/user/info”)
.map((res:Response)=>{
让userCredantials=res.json();
this.credentials.set(userCredantials);
返回用户凭据;
})
}

}
您可以使用
.asObservable()
将其作为可观察对象返回


如果要为
主题设置初始值
,可以使用
行为主体
。唯一的区别是将初始值传递给
行为主体
构造函数

import { BehaviorSubject } from 'rxjs/BehaviorSubject';

const subject = new BehaviorSubject(42);
subject.subscribe((value) => console.log(value));
// 42

subject.next(84);
// 84

我认为最简单的方法是使用
startWith()
操作符:

isAuthenticated(): Observable<boolean> {
    Observable
        .delay(1000) //delay for 1000ms
        .do(() => {
            this.isAuthenticatedSubject.next(this.oauthService.isAuthenticated());
        });
    return this.isAuthenticatedSubject.asObservable();
}
isAuthenticated(): Observable<boolean> {
    return this.isAuthenticatedSubject.startWith(this.oauthService.isAuthenticated());
}
isAuthenticated():可观察{
返回this.isAuthenticatedSubject.startWith(this.oauthService.isAuthenticated());
}

您也可以使用
BehaviorSubject
ReplaySubject
,但它们只会重复一个已经通过它们的值。也许还可以看看这个答案,以了解更详细的描述有什么区别:。

有没有一种方法我不必使用setTimeout?@user3554268为什么您首先要延迟?anyway,请参见我的编辑此.oauthService.isAuthenticated返回的是什么?理想情况下,如果返回的是可观察的,则不需要使用超时
isAuthenticated(): Observable<boolean> {
    return this.isAuthenticatedSubject.startWith(this.oauthService.isAuthenticated());
}