You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase实时数据库点赞更新函数递归执行问题求助

迷因网站点赞功能递归执行问题解决

问题描述

开发支持用户上传迷因的网站时,实现点赞更新功能遇到异常:点击点赞按钮后,like函数会无限递归执行,Firebase实时数据库中的likes数组持续重复添加用户对象。

相关代码

JavaScript代码

function like(id) {

  firebase.database().ref("memes/" + id).on("value", (snap) => {

    const cs = snap.val().likes || [{
      name: ""
    }]

    let res = [...cs, JSON.parse(localStorage.getItem("user"))].filter(item => item)

    console.log(res)

    firebase.database().ref("memes/" + id).update({
      likes: res,
    });
  })
}

HTML代码

<p><button onclick="like('${y.name}/${y.head}')"><ion-icon name="thumbs-up"></ion-icon></button><b>${1 || y.likes.length }</b></p>

问题原因

代码中使用on("value")持续监听数据库数据变化,每次调用update修改likes数组后,数据库更新会触发监听回调,回调里再次执行update,形成无限递归循环,导致数组被反复追加内容。

解决方案

1. 替换监听方式为一次性读取

将on("value")改为once("value"),仅读取一次数据,不持续监听变化,从根源避免递归触发:

function like(id) {
  firebase.database().ref("memes/" + id).once("value", (snap) => {
    // 用空数组替代默认空对象,逻辑更合理
    const cs = snap.val().likes || [];
    const currentUser = JSON.parse(localStorage.getItem("user"));

    // 新增判断:检查用户是否已点赞,避免重复添加
    const hasLiked = cs.some(item => item.name === currentUser.name);
    if (hasLiked) return;

    const res = [...cs, currentUser].filter(item => item);
    firebase.database().ref("memes/" + id).update({ likes: res });
  });
}

2. 修正点赞数显示逻辑

原HTML中点赞数的判断逻辑错误,调整为显示实际点赞数量,无点赞时显示0:

<p><button onclick="like('${y.name}/${y.head}')"><ion-icon name="thumbs-up"></ion-icon></button><b>${y.likes ? y.likes.length : 0}</b></p>

内容的提问来源于stack exchange,提问作者COLONEL FF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 18:12:54