我在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;
})
}
答案 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 }
}
然后你可能仍然遇到无限循环的问题,但可能要解决这个问题,你需要重新审视你的设计