流星 - 检测无限循环



这是一些用于计算事物的流星应用程序的某些代码的本质(带有关联的数据(。计数可以链接在一起,以便可以增加另一个:

// The counting and linking code.
Meteor.methods({
    'counts.increment'(countId) {
        const count = Counts.findOne(countId);
        Counts.update(countId,{ $inc: { count: 1 } })
        Meteor.call('counts.check-links',count._id);
    },
    'counts.check-links'(countId){
        var count = Counts.findOne(countId);
        count.links.forEach(function (linkId) {
            updated = false;
            const link = Links.findOne(linkId);
            const primary = Counts.findOne(link.primary);
            const secondary = Counts.findOne(link.secondary);
            if (primary.count == link.level) {
                updated = true;
                Counts.update(secondary._id, {$inc: {count: 1}});
            }
            if (updated) {
                Meteor.call('counts.check-links',secondary._id);
            }
        })
    }
})
// Some data...
Count: {
  _id: 1,
  value: 0,
  name: A,
  links: [3]
}
Count: {
  _id: 2,
  value: 0,
  name: B,
  links: [4]
}
Link: {
  _id: 3,
  primary: 1,
  secondary: 2
}
Link: {
  _id: 4,
  primary: 2,
  secondary: 1
}

因此,如果称为Meteor.call('projects.increment',1),则此代码将崩溃,因为每个计数都链接到另一个计数。检测这种设置可能很困难,因为计数的排列可能非常复杂,并且链接也可以减小,设置为零,操作每个N计数& c。& c。出于提出这个问题的目的,不过。

我想到的一种可能性是在counts.check-links中添加一个计数器,该计数器将在任意循环(例如,例如(之后停止执行。5.据推测,要防止对该计数器的值进行篡改,必须存储在数据库中,并通过流星方法采取行动。在任何 check-links调用序列的结论结束时,都需要重置它。

我不确定这是否是最好的主意,或者是否是实施它的好方法,因此我有兴趣知道是否有人有任何建议。

您可以创建已经访问过的所有对象(" counts"(的集合;因此,如果您按照指向这样对象的链接,可以避免再次处理它,从而陷入无限的递归中。

编辑:示例我不熟悉流星,因此,如果它无法正常工作,请原谅...对于所有允许对象参考指示的编程语言来说,这是一个常见的问题,解决方案遵循类似的模式。<<<<<<<<<<<<<</p>

// The counting and linking code.
Meteor.methods({
  ...
'counts.check-links'(countId, alreadyVisited){
    if (!alreadyVisited) alreadyVisited = {};
    if (alreadyVisited[countId]) return;
    alreadyVisited[countId] = true;
    var count = Counts.findOne(countId);
    count.links.forEach(function (linkId) {
        updated = false;
        const link = Links.findOne(linkId);
        const primary = Counts.findOne(link.primary);
        const secondary = Counts.findOne(link.secondary);
        if (primary.count == link.level) {
            updated = true;
            Counts.update(secondary._id, {$inc: {count: 1}});
        }
        if (updated) {
            Meteor.call('counts.check-links',secondary._id, alreadyVisited);
        }
    })
}

相关内容

  • 没有找到相关文章

最新更新