无法从Observable中的BehaviorSubject获取任何值

时间:2019-11-13 05:36:14

标签: angular typescript observable behaviorsubject

我试图将可观察函数内部的一些数据从几个服务传递到一个不相关的组件,而不通过使用BehaviorSubject进行服务调用。但是,并非所有人都可以。

service.ts

export class Data{
 name:string;
 age:number;
 class:string;
 constructor(){
  this.name = "";
  this.age = null;
  this.class="";
 }
}
@Injectable()
export class InfoService {

 public myData = new Data();
 dataSubject = new BehaviorSubject<any>(this.myData);
 dataInfo = this.dataSubject.asObservable();

 constructor(private http:HttpClient){}
 getData(id:Id):Observable<any>{
  this.http.get(url+"id="+id).pipe(first()).subscribe(res=>{
    this.myData = res['data'];
    this.dataSubject.next(this.myData);
    console.log(this.myData);
  }
  return this.http.get(url+"id="+id);
}

我从服务文件中console.log中获取了值。

componenet.ts

export class Employee implements OnInit{

    constructor(public infoS:InfoService ){}

    ngOnInIt(){
        this.infoS.dataInfo.subscribe(res=>{
          console.log(res);
        }
    }
}

在组件文件中,console.log给了我一个空的Data对象。我检查检查控制台,在运行服务线之前先运行组件线。有什么办法可以让组件在服务运行后运行? 另外,正如我在一开始提到的那样,其中一些正在运行。控制台显示工作中的组件线在服务线之前和之后运行。因此,正常运行的一个组件行实际上运行了两次,一个运行在服务行之前,之后运行了一个。

2 个答案:

答案 0 :(得分:1)

dataInfo仅是第一次获得行为主体的价值,并且在行为主体更新时不会更新,因此您需要直接订阅dataSubject行为主体:

ngOnInIt(){
   this.infoS.dataSubject.subscribe(res=>{
          console.log(res);
   }
}

答案 1 :(得分:0)

尝试执行以下操作:


this.infoS.dataInfo.subscribe(res=>{
   if(res) {
       console.log(res);
   }
}