我的 Node.js
应用程序中有一个 javascript 函数,它调用自身来查找其在 MongoDB 的父子层次结构中的级别。文档将尝试找到其父文档,如果找到,则会提高级别并继续下去,直到找不到父文档。看起来像下面这样,
function findLevel(doc, level, callback){
if(!doc)
return callback(null, level);
var query = {
id: doc.parentID
};
model.findOne(query, function(err, parentDoc){
if(err){
return callback(err, level)
};
return findLevel(parentDoc, level+1, callback);
})
}
这很有可能产生无限递归调用。其中一种情况是parentID 与当前文档的id 相同。可以通过在查找查询中包含另一个条件来避免这种情况,但我仍然担心我可能会错过一些东西,并且它可能会导致整个应用程序崩溃/终止。 Node.js 中是否有推荐的方法来避免/防止这种情况?或者我们可以限制递归调用的级别并优雅地停止它,就像说递归调用应该只进行到这个 n
级别?
最佳答案
您可以通过记下递归期间遇到的所有 ID 并在之前处理过 ID 后立即停止来实现循环检测。
function findLevel(doc, callback) {
var level = 0, seen = {};
(function getParent(doc) {
// proper termination
if(!doc || !doc.parentID) return callback(null, level);
// cycle detection
if (seen.hasOwnProperty(doc.parentID)) return callback(new Error("cycle detected"));
seen[doc.parentID] = true;
// recursion
model.findOne({id: doc.parentID}, function (err, parentDoc) {
if (err) return callback(err);
level++;
getParent(parentDoc);
});
})(doc);
}
关于javascript - 如何避免/防止 Node.js 中的无限递归调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42409744/