如何根据某个参数从一个observable获取数据,然后更新该数据?

时间:2018-03-28 23:34:21

标签: angular asynchronous rxjs observable google-cloud-firestore

我在firestore'user'中有一个集合,其中包含具有属性的文档

 users:{
    userId:string;
    userName:string;
    stars:number
    }

我想获取特定用户的星星,然后更新该用户的星星。 在我的组件中,我有一个方法可以调用一个observable来获取星星,一旦获取了星星,我想更新星星值。但我遇到的问题是,由于getuserStars(userId)异步运行,我的userStars变量在更新之前是未定义的。此外,我尝试更新subscribe方法中的星星,但是当数据得到更新并且observable返回新数据时会遇到无限循环,并且再次调用subscribe创建无限循环。 任何帮助?

let userStars;

 setUserStars(userId){
   getuserStars(userId);

   let starsCount=this.userStars+25;

   this.afs.collection('users').doc(userId).update({
    stars:starsCount
  }).catch(err=>console.log(err));

}

getuserStars(userId){
     this.subscription= this.afs.doc<User> 
     (`users/${userId}`).valueChanges().subscribe(user=>{
       this.userStars=user.stars;
     })
    }

1 个答案:

答案 0 :(得分:0)

读取和更新都是基于可观察的操作,因此如果要一个接一个地执行它们,则需要通过运算符链接它们,通常是switchMap。以下几行

function readStuff(): Obaservable<any> {// get stuff from source };

function updateStuff(stuff): Observable<any> { // update stuff on the source }

readStuff()
.switchMap(stuff => updateStuff(stuff))
.subscribe (
   returnValue => {// do something with the return value},
   error => {// handle error condition }
}

然后你可能仍然遇到无限循环的问题,但可能要解决这个问题,你需要重新审视你的设计