Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript RxJs从可观测数据中获取值_Typescript_Angular_Rxjs_Observable - Fatal编程技术网

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