Javascript 在js中建立声誉/业力系统

Javascript 在js中建立声誉/业力系统,javascript,angular,firebase,firebase-realtime-database,Javascript,Angular,Firebase,Firebase Realtime Database,这就是让我绊倒的原因: 当用户对帖子进行投票时,他们会得到+2业力 当用户对帖子投了否决票时,他们会得到+2业力 当用户取消/取消投票时,他们会得到-2业力。(净额0) 被否决的用户帖子获得-2业力 被提升的用户帖子获得+2业力 当某人取消/删除其投票时,如果是向上投票,则发布的用户将获得-2,如果是向下投票,则获得+2。。(净额0) 我不知道这是否有意义,但本质上我想奖励投了票的人,惩罚那些创造坏帖子的人 以下是我所拥有的: 在我的数据库中,当一篇文章获得一个向上投票时,this.user

这就是让我绊倒的原因:

  • 当用户对帖子进行投票时,他们会得到
    +2
    业力

  • 当用户对帖子投了否决票时,他们会得到
    +2
    业力

  • 当用户取消/取消投票时,他们会得到
    -2
    业力。(净额0)

  • 被否决的用户帖子获得
    -2
    业力

  • 被提升的用户帖子获得
    +2
    业力

  • 当某人取消/删除其投票时,如果是向上投票,则发布的用户将获得
    -2
    ,如果是向下投票,则获得
    +2
    。。(净额0)

我不知道这是否有意义,但本质上我想奖励投了票的人,惩罚那些创造坏帖子的人

以下是我所拥有的:

在我的数据库中,当一篇文章获得一个向上投票
时,this.userVote
1
,向下投票是
-1
,删除他们的投票是
0

upvote() {
   let vote = this.userVote == 1 ? 0 : 1;
   this.database.list('/upvotes/'+this.postData.id).set(this.userData.uid, vote)
}

downvote() {
    let vote = this.userVote == -1 ? 0 : -1;
    this.database.list('/upvotes/'+this.postData.id).set(this.userData.uid, vote)
}
因此,正如我在上面所描述的那样,这是按照预期工作的

问题是,我不知道如何设置业力,使其按预期工作

我目前正在做以下工作来更新用户业力以及海报业力:

this.database.database.ref('users/'+this.userData.uid).update({'karma': this.userKarma + karma}) //this.userKarma is the users karma
this.database.database.ref('users/'+this.postData.uid).update({'karma': this.postKarma + karma}) //this.postKarma is the karma of the user who created the post
我应该如何设置变量
karma
,使其与我前面提到的一样

有什么建议吗?谢谢大家!

你可以用。事务是一种原子(firebase中没有真正的原子)更新数据的方法

例如,将业力减少1

this.database.database.ref('users/'+this.userData.uid).child('karma')
    .transaction(function(karma){
        if (!karma)
            return 0;
        return karma - 1;
});

最后我就这样解决了:

getKarmaDelta(prevVote, vote) {
    if((prevVote !== 1 && prevVote !== -1) && (vote === 1 || vote === -1)) {
      this.updateUserKarma(2)
    } else if (vote === 0) {
      this.updateUserKarma(-2)
    }
      if(vote === -1 || (vote === 0 && prevVote === 1)) {
        this.updatePosterKarma(-2)
      } else if (vote === 1 || (vote === 0 && prevVote === -1)) {
        this.updatePosterKarma(2)
      }
  }
希望这对其他人有帮助