我的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相同。可以通过在find查询中包含另一个条件来避免这种情况,但是我仍然担心自己可能会遗漏某些东西,并且可能导致整个应用程序崩溃/崩溃。有没有推荐的方法来避免/预防
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/