javascript - Meteor递归方法调用导致无限循环

标签 javascript meteor

给定树中的(父)节点,我需要检索 [1] 父节点下的子节点数量加上父节点的子节点加上父节点的子节点的子节点,依此类推 [2] [1] 中标记的子节点数量“打开”。

我的测试数据有一个 parent ,有两个 child 。我的方法-

Meteor.methods({
...
   'getSubCounts': function(selectedNodeId){
    var children = ItemList.find({"parent.parentid": selectedNodeId}).fetch();
    var numChildren = children.length;
    console.log("Number of children of " + selectedNodeId + ": " + numChildren);

    var openChildrenCount = children.filter(function(row) {
        return (row.status === "OPEN");
    }).length;

    for (i = 0; i < numChildren; i++) { 
        console.log("iterations for child " + i + ": " + children[i]._id);

        Meteor.call('getSubCounts', children[i]._id, function(error, result) {
            if(error) {
                console.log("error occured during iteration " + error);
            } else {
                numChildren = numChildren + result.numChildren;
                openChildrenCount = openChildrenCount + result.openChildrenCount;
            }
        });

    }

    return {numChildren: numChildren, openChildrenCount: openChildrenCount};
    },
...
});

我在客户端助手中调用 -

'subcounts': function(){
    if (this._id != null) {
        Meteor.call('getSubCounts', this._id, function(error, result) {
            if(error) {
                // nothing
            } else {
                Session.set('subcountsdata', result)
            }
        });

从(浏览器)输出来看,第一个子级似乎按预期进行迭代,但第二个子级陷入了无限循环。 (请注意,父节点 ID 为 8veHSdhXKjyFqYZtx,子节点 ID 为 iNXvZGaTK3RR6Pekj,C6WGaahHrPiWP7zGe)

Number of children of 8veHSdhXKjyFqYZtx: 2
iterations for child 0: iNXvZGaTK3RR6Pekj
Number of children of iNXvZGaTK3RR6Pekj: 0
iterations for child 1: C6WGaahHrPiWP7zGe 
Number of children of C6WGaahHrPiWP7zGe: 0 
iterations for child 1: C6WGaahHrPiWP7zGe
Number of children of C6WGaahHrPiWP7zGe: 0 
iterations for child 1: C6WGaahHrPiWP7zGe
Number of children of C6WGaahHrPiWP7zGe: 0 
iterations for child 1: C6WGaahHrPiWP7zGe
Number of children of C6WGaahHrPiWP7zGe: 0 
....

为什么在这种情况下第二次迭代会无限发生?看起来是由于 react 性造成的,但我不太明白真正的原因。

最佳答案

很可能您只是在方法函数中缺少var i

如果不将 i 声明为局部变量,您可以使用全局范围变量,每次调用方法时该变量都会重新分配为 0。

顺便说一句:

  • 避免递归 Meteor 方法。您正在创建网络请求循环。如果您需要递归,请在专用函数中外部化。
  • 避免在助手中调用 Meteor 方法。请改用 ReactiveVar 并仅在必要时进行调用,通常是在 Blaze 模板生命周期 Hook (如 onCreated)或事件监听器中进行调用。

关于javascript - Meteor递归方法调用导致无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54256432/

相关文章:

javascript - 如何在包含 2 个属性名称(其中一个是常量)的对象中选择属性名称?

javascript - 使用 onclick 显示某些 DIV

javascript - 全局模板助手在meteor部署服务器上未定义

javascript - 创建具有 3 个属性的 json 文件

javascript - 从js上传图像文件到azure blob存储

Javascript词频书签在输出中省略了一些字母

javascript - meteor 路线未注册

Meteor blaze 通过数组索引选择一个特定的项目

javascript - Demeteorizer编译meteor app并导致WebSocket连接错误?

javascript - meteor 发布订阅不是被动的