Firebase 中的递归错误太多

2024-06-27

我的全局作用域中有一个函数,用于侦听 FB 引用上的值。

function updateCredits(userID){

    var userRef = database.ref('users/' + userID);
    userRef.on('value', function(snapshot){        
        var userCredits = snapshot.val().credits;
        console.log(userCredits);
        console.log('account: ' + userID + " has " + userCredits + " credits");
        var updatedCredits = userCredits + ANTE;
        userRef.update({credits: updatedCredits});        
        console.log("now it has " + updatedCredits + ANTE);
    });
}

articlesRef.on('child_added', function(data) {
    var upVoteRef = database.ref('articles/' + data.key + '/upVotes/');
    try {
        var upVotersRef = database.ref('articles/' + data.key + '/upVoters/');
        upVoteRef.on('value', function(childData){
            upVotersRef.on('value', function(voterData){
                var voterKeys = Object.keys(voterData.val());
                for (var i=0; i<voterKeys.length; i++){                
                    upVotersRef.child(voterKeys[i]).on('value', function(voterID){
                        console.log("trying with voter ID " + voterID.val());
                        updateCredits(voterID.val());                    
                    });                
                }
            });
        });
    } catch(err){

        console.log(err.message);

    }

    var downVoteRef = database.ref('articles/' + data.key + '/downVotes/');
    downVoteRef.on('value', function(childData){
        console.log(childData.val());

    });


});

不知何故,当我加载页面时,这个函数显然被调用了数百或数千次。我将其记录到控制台:

account: HMHZ8Ga3UGhc2wSczHDuFL82FB02 has 1328.6999999997329 credits  app.js:25:9
1328.6999999997329  app.js:24:9
1328.8999999997327  app.js:24:9
account: HMHZ8Ga3UGhc2wSczHDuFL82FB02 has 1328.8999999997327 credits  app.js:25:9
1328.8999999997327  app.js:24:9
account: HMHZ8Ga3UGhc2wSczHDuFL82FB02 has 1328.8999999997327 credits  app.js:25:9
1328.9999999997326  app.js:24:9
account: HMHZ8Ga3UGhc2wSczHDuFL82FB02 has 1328.9999999997326 credits  app.js:25:9
1328.9999999997326  app.js:24:9
account: HMHZ8Ga3UGhc2wSczHDuFL82FB02 has 1328.9999999997326 credits  ...

(如您所见,由于某种原因,同一个帐户被重复给予积分。我希望它仅在 upVote 上获得积分);

它继续与..

now it has 1330.09999999973160.1  app.js:28:9
now it has 1329.99999999973170.1  app.js:28:9
now it has 1329.89999999973180.1  app.js:28:9
now it has 1329.79999999973190.1  app.js:28:9
now it has 1329.6999999997320.1  app.js:28:9

... 最后是问题:

too much recursion[Learn More]  firebase.js:293:781

我猜想 updateCredits 函数正在触发 upVoteRef 监听的事件,该事件又调用 updateCredits 函数并变成循环。我不知道如何避免这种情况。有任何想法吗?


Solution

你可以做

userRef.once('value').then(function(snapshot){

代替

userRef.on('value', function(snapshot){  

解释

on('value') 的作用是,它会触发一次以获取该路径上的所有数据,然后每次都会再次触发该路径上的数据发生变化.

由于您在回调中的同一路径上更新了数据

userRef.update({credits: updatedCredits});

该路径上的数据发生变化,原始事件(usersRef 上的 .value)再次触发,这反过来又触发您的回调,您再次更新该值......等等。这是一个无限循环,会导致您的错误。

为了避免这种情况,您可以根据您想要实现的目标执行多项操作。如果您只想在有人跑步时添加 ANTE

updateCredits(voterID.val()); 

然后,您只想读取 userRef 处的数据一次,而不是主动观察该路径。因此,.once 代替 .on

See 读取数据一次 - Firebase 文档 https://firebase.google.com/docs/database/web/read-and-write#read_data_once

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Firebase 中的递归错误太多 的相关文章

  • javascript 可以从父页面访问 iframe 元素吗?

    我的页面上有 iframe iframe 和父页面位于不同的域中 父页面上的 javascript 代码可以访问此 iframe 内的元素吗 如果页面来自不同的域 则不应该这样做 浏览器安全沙箱应该阻止这种类型的访问 当两个页面来自不同的时
  • Puppeteer - 错误:协议错误 (Network.getResponseBody):找不到具有给定标识符的资源

    我正在尝试使用此代码使用 puppeteer 从网站获取响应正文 usr bin env node require dotenv config const puppeteer require puppeteer const readline
  • 如何在 js.erb 中使用 Ruby 代码?

    我可以使用以下方式在模态中渲染部分内容escape javascript在js erb文件代码中 body append my modal modal show 但是 我似乎无法获得以下结果 console log ERB 将输出一个纯字符
  • 各种 Javascript 优化项目如何影响 DOM 性能?

    通过 Tracemonkey Squirrelfish 和 V8 项目 大量 C S 计算机科学融入了 Javascript 这些项目 或其他项目 是否解决了 DOM 操作的性能问题 或者它们纯粹与 Javascript 计算相关 纯 DO
  • 如何在 Jasmine JS 中重用 beforeEach/afterEach?

    当使用 JasmineJS 编写测试时 我有许多具有类似 beforeEach afterEach 代码的测试 有没有办法使用 JasmineJS 测试套件实现继承模型 我可以将所有测试分组为一个describe但在这种情况下 我将以包含所
  • 计算两列中两个总和的平均值,并将其显示在 JQGrid 的下一列中

    I m using Jqgrid with summery row at grouping level Now I want to know one thing that Is it possible to show average cal
  • Webpack、Sass - 超出最大调用堆栈大小

    我正在为我的 JS 应用程序使用 Webpack 对于样式 我使用 Sass 我的应用程序非常大 所以我使用了很多 mixins 和 includes 在过去的几天里 虽然应用程序的 SASS 数据增长了一些 我多次遇到相同的以下错误 未捕
  • 如何在 Bootstrap 中将单选按钮设置为“选中”? [复制]

    这个问题在这里已经有答案了 我使用 Bootstrap 按钮作为单选按钮 http getbootstrap com javascript buttons http getbootstrap com javascript buttons 这
  • 在 Javascript 中隐藏按钮

    在我最新的程序中 有一个按钮 单击时会显示一些输入弹出框 这些框消失后 如何隐藏按钮 You can set its visibility财产 http www w3schools com cssref pr class visibilit
  • 通过标记或JS强制下载

    假设我在 CDN 来自 Rackspace 的云文件 上有一个文件 以及一个包含该文件链接的静态 html 页面 有什么方法可以强制下载此文件 以防止它在浏览器中打开 例如 mp3 我们可以让我们的服务器读取该文件并将相应的标头设置为 he
  • Angular 4 - 具有动态参数值的自定义验证器

    我编写了一个自定义验证器 用于检查日期是否高于某个最小日期 代码如下所示 export function validateMinDate min Date ValidatorFn return c AbstractControl gt if
  • 发送带有图像的嵌套 JSON

    我一直在尝试研究一种能够通过 Ajax 将嵌套 JSON 请求发送回服务器的方法 根据我的理解 我们主要用于向服务器发送图像或文件的 formdata 在这种情况下不起作用 因为 FormData 似乎不处理嵌套对象 这就是我需要发送的有效
  • 在 Javascript 中实现 Zobrist 哈希

    我需要在 Javascript 中为国际象棋引擎实现 Zobrist 哈希 我想知道实现此目的的最佳方法是什么 现在 我不是计算机科学家 也从未上过正式的算法和数据结构课程 所以如果我在这方面有点偏离 我很抱歉 据我了解 我需要一个 64
  • jQuery onclick 隐藏其父元素[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想隐藏 li tag on a 使
  • 在 ReactJS 中更改 URL onClick

    在我的项目中我有一个TabComponent它显示 3 个选项卡 首页 热门 全部 现在 我正在使用context反应维持 activetab它存储当前选项卡 toggleTab改变的方法activetab using setState 选
  • 提交外部有 INPUT 的表单,并修改值后

    我有一个form 有几个
  • 为什么我的数据没有存储到我的 Firebase 实时数据库中?

    我正在尝试为网络应用程序制作一个注册页面 这会将数据发送到 firebase 数据库 我已阅读官方 firebase 文档并按照说明写入数据 但什么也不会写 在我的数据库控制台中 它显示的所有内容都是空 而不是我的数据 我没有收到控制台错误
  • execCommand 的替代品

    我希望创建一个所见即所得编辑器 使用 jQuery 作为框架 我可以使用不同的方法来简化生产 我现在确实有一个正在工作的编辑 而且运作良好 我使用 iFrame 并将其设计模式设置为打开并从那里开始 然而 有一些事情困扰着我 以更改所选文本
  • Javascript - 通过键获取特定 JSON 数组元素内的属性值

    我有一个像这样的 JSON 结构 map key1 valueA1 key2 valueA2 key3 valueA3 key1 valueB1 key2 valueB2 key3 valueB3 key1 valueC1 key2 val
  • 我可以在 Firebase 上管理多少个客户端应用?

    非常简单的用例 客户购买我们的应用程序并每月支付 20 美元 我们希望在 iOS 和 Android 上实现推送通知 并正在考虑可扩展的解决方案 我们考虑简单地将所有应用程序分组到一个 Firebase 项目中 因为我们只需要推送通知 Go

随机推荐