如何从一个订阅中接收2个不同的值?

时间:2019-03-22 15:05:28

标签: angular firebase rxjs

是否可以从一个订阅中获取两个值?第一个是所有概要文件数据,第二个只是按名称过滤的收藏夹数据。 我想使用最少数量的Firebase请求。

数据库结构:

profile{
        uid{
            name,
            age,
            favorite{
                     name,
                     uid,
                    }
            }
        }

这是组件代码:

  ngOnInit() {
    this.db.getDataObj("/Profile/" + this.uid).subscribe(res =>{
      console.log("Profile Result");
      console.log(res);
    });
    this.db.getDataObj("/Profile/" + this.uid/favorite).subscribe(res =>{
      console.log("Profile Result");
      console.log(res);
    });

这是服务代码:

  getDataObj(objpath:string){
    this.objRef = this.db.object(objpath);
    this.obj = this.objRef.valueChanges();
    return this.obj;
   } 

2 个答案:

答案 0 :(得分:0)

那是不可能的。 一个请求将始终返回一个响应。

但是,查看您的数据库结构,您只需要一个请求即可。

this.db.getDataObj("/Profile/" + this.uid).subscribe(res =>{
   console.log("Profile Result");
   console.log(res);
});

此处的“ res”应包含完整的配置文件对象(包括“收藏夹”对象)。

如果您仍然想使此代码更短/更干净,可以考虑创建一个可观察到的“ zip”。更多信息here

答案 1 :(得分:0)

如果我的理解正确,那么请创建以下界面:

interface Profile{
    uid:uid;
}

interface uid{

    name:string;
    age:number;
    favourite:favourite;
}

interface favourite{

    name:string;
    uid:string;
}

,然后在您的服务中使用以下内容:

getDataObj(objpath:string):Observable<Profile>{
    return this.http.get<Profile>(objpath);
}

,然后读取喜欢的值,例如:

this.db.getDataObj("/Profile/" + this.uid).subscribe(res<Profile> =>{
    console.log("Profile Result");
    console.log(res.uid.favourite);
});

如果可能,请尝试使用该uid的配置文件获取与uid收藏夹相关的数据,这样,您将只有一个服务调用来获取所有数据。如果此调用不占用大量数据,我认为这是可行的方法。否则,从长远的角度来看,如果您应该在Profile Service http调用中接收的数据量应该增加,那么可以使用单独的http调用来获取一个uid的配置文件和收藏夹数据。

这是我第一次在此论坛上回答问题,请随时向我提供有关我的回答的反馈。