Typescript RxJs从可观测数据中获取值
在组件中:Typescript RxJs从可观测数据中获取值,typescript,angular,rxjs,observable,Typescript,Angular,Rxjs,Observable,在组件中: singleEvent$: Observable<Event>; 如何获取当前值,如event.name?要从可观察对象获取数据,您需要订阅: this.singleEvents$.subscribe(event => this.event = event); 在模板中,您可以使用以下命令直接绑定到观测值: 再加上Günter Zöbauer的答案,如果你想同步获得你的可观察对象内部的价值,那么行为主体可能就是你想要的 BehaviorSubject是始终具有值
singleEvent$: Observable<Event>;
如何获取当前值,如
event.name
?要从可观察对象获取数据,您需要订阅:
this.singleEvents$.subscribe(event => this.event = event);
在模板中,您可以使用以下命令直接绑定到观测值:
再加上Günter Zöbauer的答案,如果你想同步获得你的可观察对象内部的价值,那么行为主体可能就是你想要的 BehaviorSubject是始终具有值的可观察对象,您可以调用
myBehaviorSubject.getValue()
或myBehaviorSubject.value
以同步检索BehaviorSubject当前持有的值
因为它本身也是一个可观察的对象,所以您仍然可以订阅BehaviorSubject,以异步地响应它所持有的值的更改(例如myBehaviorSubject.subscribe(event=>{this.event=event})
),并在组件的模板中使用异步管道(例如{myBehaviorSubject | async}
)
以下是与给定示例相匹配的一些用法,用于从给定服务在组件中创建BehaviorSubject:
@Component({
//...
})
export class YourComponent implements OnInit {
singleEvent$: BehaviorSubject<Event>;
constructor(private eventService: EventService){}
ngOnInit(){
const eventid = 'id'; // <-- actual id could go here
this.eventService.events$
.pipe(
map(events => {
let eventObject = events.find(item => item.id === eventid);
let eventClass: Event = new Event(eventObject);
return eventClass;
})
)
.subscribe(event => {
if(!this.singleEvent$){
this.singleEvent$ = new BehaviorSubject(event);
} else {
this.singleEvent$.next(event);
}
});
}
}
@组件({
//...
})
导出类YourComponent实现OnInit{
singleEvent$:行为主体;
构造函数(私有eventService:eventService){}
恩戈尼尼特(){
const eventid='id';//{
让eventObject=events.find(item=>item.id==eventid);
让eventClass:Event=新事件(eventObject);
返回事件类;
})
)
.订阅(事件=>{
如果(!this.singleEvent$){
this.singleEvent$=新行为主体(事件);
}否则{
this.singleEvent$.next(事件);
}
});
}
}
您可以使用observable.pipe(take(1)).subscribe
将observable限制为仅获取一个值,并停止侦听更多值
let firstName: string;
this.insureFirstName
.pipe(take(1)) //this will limit the observable to only one value
.subscribe((firstName: string) => {
this.firstName = firstName; asssgning value
});
console.log(this.firstName); //accessing the value
请在问题中添加更多代码。plunk也可以。我的订阅服务器在服务中,但我需要在组件中命名抱歉,从您的评论中我看不出任何意义。我认为他的意思是在他使用的服务中。订阅,然后拥有组件使用的主题(或类似主题)。假设有一个页面组件,其子组件接受异步输入。那么父组件需要一些其他请求的数据吗?@Mackelito抱歉,但这并不能让事情变得更清楚。如果这确实是一个困扰您的问题,那么我建议创建一个新的问题,其中包括演示您尝试完成的任务的代码。我相信他缺少的是他需要使用的功能。同时在组件中订阅。:)我想要的是一个无需订阅、无需使用BehaviorSubject即可观察的可观察对象,因为您可以使用next()对其进行修改。最近,对于@Narvalex可能感兴趣的类似用例,您非常喜欢async/await API。我们的想法是这样使用它:
const foo=await obs$.pipe(take(1)).toPromise()
在异步函数中。感谢您的提示。这确实是一个关于主题和行为主题之间区别的采访问题,现在我已经很清楚了。在组件上公开BehaviorSubject
是否有风险?!如果您只是公开行为主体
,那么使用可观察的
(克隆)有什么意义?
@Component({
//...
})
export class YourComponent implements OnInit {
singleEvent$: BehaviorSubject<Event>;
constructor(private eventService: EventService){}
ngOnInit(){
const eventid = 'id'; // <-- actual id could go here
this.eventService.events$
.pipe(
map(events => {
let eventObject = events.find(item => item.id === eventid);
let eventClass: Event = new Event(eventObject);
return eventClass;
})
)
.subscribe(event => {
if(!this.singleEvent$){
this.singleEvent$ = new BehaviorSubject(event);
} else {
this.singleEvent$.next(event);
}
});
}
}
let firstName: string;
this.insureFirstName
.pipe(take(1)) //this will limit the observable to only one value
.subscribe((firstName: string) => {
this.firstName = firstName; asssgning value
});
console.log(this.firstName); //accessing the value