gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:20:38 25 4
gpt4 key购买 nike

给定树中的(父)节点,我需要检索 [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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com